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);
}
}
也就是说泛型接口->泛型类->具体接口继承泛型接口->具体类继承具体接口和泛型类的方式变为
因此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的需求为核心;
Repository是DDD中的概念,强调Repository是受Domain驱动的,Repository中定义的功能要体现Domain的意图和约束,而Dal更纯粹的就是提供数据访问的功能,并不严格受限于Business层.
就拿上面写的User的例子来说,使用Repository,隐含着一种意图倾向,就是Domain需要什么我才提供什么,不该提供的功能就不要提供,一切都是以Domain的需求为核心;
而使用Dal,其意图倾向在于我Dal层能使用的数据库访问操作提供给Business层,你Business要用哪个自己选.换一个Business也可以用我这个Dal,一切是以我Dal能提供什么操作为核心.