Repository模式

来源:互联网 发布:通天塔 网络政治效应 编辑:程序博客网 时间:2024/05/16 09:24
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能提供什么操作为核心.
0 0
原创粉丝点击