打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Repository模式

近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式。就简单看了下。

在《企业架构模式》中,译者将Repository翻译为资源库。给出如下说明:
通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调。

在《领域驱动设计:软件核心复杂性应对之道》中,译者将Repository翻译为仓储,给出如下说明:
一种用来封装存储,读取和查找行为的机制,它模拟了一个对象集合。

使用该模式的最大好处就是将领域模型从客户代码和数据映射层之间解耦出来。

我们来看下在LinqToSql中如何应用该模式。
1. 我们将对实体的公共操作部分,提取为IRepository接口,比如常见的增加,删除等方法。如下代码:

interface IRepository<T> where T : class{    IEnumerable<T> FindAll(Func<T, bool> exp);    void Add(T entity);    void Delete(T entity);    void Save();}

2.下面我们实现一个泛型的类来具体实现上面的接口的方法。

public class Repository<T> : IRepository<T> where T : class{    public DataContext context;    public Repository(DataContext context)    {        this.context = context;    }    public IEnumerable<T> FindAll(Func<T, bool> exp)    {        return context.GetTable<T>().Where(exp);    }    public void Add(T entity)    {        context.GetTable<T>().InsertOnSubmit(entity);    }    public void Delete(T entity)    {        context.GetTable<T>().DeleteOnSubmit(entity);    }    public void Save()    {        context.SubmitChanges();    }}

3.上面我们实现是每个实体公共的操作,但是实际中每个实体都有符合自己业务的逻辑。我们单独定义另外一个接口,例如:

interface IBookRepository : IRepository<Book>{    IList<Book> GetAllByBookId(int id);}

4.最后该实体的Repository类实现如下:

public class BookRepository : Repository<Book>, IBookRepository{    public BookRepository(DataContext dc)        : base(dc)    { }    public IList<Book> GetAllByBookId(int id)    {        var listbook = from c in context.GetTable<Book>()                       where c.BookId == id                       select c;        return listbook.ToList();    }} 

上面只是为大家提供了一个最基本使用框架。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MVC中的Repository模式
应用程序框架实战二十二 : DDD分层架构之仓储(层超类型基础篇)
Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
C#进阶系列——MEF实现设计上的“松耦合”(二)
依赖注入框架Autofac(IOC)的简单使用
企业模式之Unit Of Work模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服