110,538
社区成员
发帖
与我相关
我的任务
分享
public interface IServiceBase<T>
{
List<T> Query(int startIndex, int pageSize, ref int totalCount);//分页查询
List<T> GetAll();
T GetByID(int id);
}
#region Event
public delegate void OnDataChanged(object sender, DataChangedEventArg<T> e);//定义一个委托类型 他可以作为事件
public event OnDataChanged DataChanged;//定义一个事件 该事件类型呢就是我们刚刚定义的委托 一会儿我们会解释为什么要用事件而不是直接将委托暴露出去
protected void CallEvent(List<T> eventData)//事件的调用方法 eventData就是我们的事件参数 更好的理解呢 应该是 事件发生时候的上下文
{
if (this.DataChanged != null)
{
var eventArg = new DataChangedEventArg<T>(eventData);//事件参数必须从EventArg类基础 你可以为他添加别的属性 代表事件发生时候你要传递给事件订阅者的事件上下文 本例中 实际上就是你在进行CRUD操作时所涉及到的数据
this.DataChanged(this, eventArg);
}
}
#endregion
public virtual List<T> Query(int startIndex, int pageSize, ref int totalCount)
{
var returnValue = _search.Query(startIndex, pageSize, ref totalCount);//这个_search变量是ServiceBase的字段 其实就是个数据访问组件 这里也可以理解三层架构的意义 我们在底层数据层只做基础的CRUD 返回一致的对象List,Service层呢则会进行一些别的操作 比如我们的缓存控制
CallEvent(returnValue);//在执行分页查询的时候 触发了我们的事件 虽然这里形式上是一种方法调用
return returnValue;
}
public NewsQueryService(NewsTemplateQuery repository)//构造方法 参数是数据层的类
: base(repository)
{
this._repository = repository;
this.DataChanged += new OnDataChanged(NewsService_DataChanged);//订阅事件
}
public override List<news> Query(int startIndex, int pageSize, ref int totalCount)
{
if(缓存存在)
{
return 缓存内容;
}
return base.Query(startIndex, pageSize, ref totalCount);//缓存不存在 则执行具体的查询操作 并由于调用了基类的Query方法 所以实际上会触发DataChanged事件 但是必须知道 触发的类是ServiceBase类 而不是这边的NewsQueryService类
}
void NewsService_DataChanged(object sender, DataChangedEventArg<news> e)//实现具体的缓存控制操作
{
var news = e.Data;//在之前的ServiceBase触发事件的时候传入的数据 保证了事件触发传递的数据只能是由事件发布者提供 在这里 就代表了具体查询到的新闻
//下面的代码呢 就是一些具体的缓存控制代码 比如说更新缓存 移除缓存 甚至可以做一些延迟绑定之类的操作
}