Repository模式

Repository模式,使用泛型Repository接口并不太合适,因为Repository接口是提供给Domain层的操作契约,不同的entity对于Domain来说可能有不同的操作约束,比如User可能不应该被删除,bookOrder可能不应该被修改,也就是说domain层根本就不应该能调用_repository<User>.Delete(user),_repository<BookOrder>.Update(bookOrder)这样的操作. 
因此Repository接口还是应该单独针对每个Eneity类来定义,比如User 
interface IUserRepository 

IEnumerable<User> FindAllUser(); 
void Add(User user); 
//void Delete(User user); //User不应该能被删除,因此接口中没有此方法 
string GetPassword(int userId);//User特有的操作 

而泛型的Repository<T>类仍然用来减少重复代码,只是不能被UserRepository类直接继承,因为这样Delete方法将侵入User类,所以改为在UserRepository中组合一个Repository<T>,将开放给domain可见且又能使用泛型重用的功能委托给这个Repository<T>, 
public class UserRepository : IUserRepository 

private DataContext context; 
private Repository<User> internalGenericRepository; 

public BookRepository(DataContext dc) 

this.context = dc; 
this.internalGenericRepository = new Repository<User>(dc); 


public void Add(User user); 

this.internalGenericRepository.Add(user); 


public string GetPassword(int userId) 

string password = context.User.where(u=>u.id==userId).select(u=>u.password); 




也就是说泛型接口->泛型类->具体接口继承泛型接口->具体类继承具体接口和泛型类的方式变为 
具体接口->具体类继承具体接口+组合泛型类


IUserRepository和通常三层架构的IUserDal从形式和功能上看差不多,个人感觉区别两者在意图上有所不同. 
Repository是DDD中的概念,强调Repository是受Domain驱动的,Repository中定义的功能要体现Domain的意图和约束,而Dal更纯粹的就是提供数据访问的功能,并不严格受限于Business层. 
就拿上面写的User的例子来说,使用Repository,隐含着一种意图倾向,就是Domain需要什么我才提供什么,不该提供的功能就不要提供,一切都是以Domain的需求为核心; 
而使用Dal,其意图倾向在于我Dal层能使用的数据库访问操作提供给Business层,你Business要用哪个自己选.换一个Business也可以用我这个Dal,一切是以我Dal能提供什么操作为核心.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值