我有这个:
public interface IRepository<T> where T : class
{
void Delete(T entity);
void Add(T entity);
void Attach(T entity);
void Detach(T entity);
void SaveChanges();
}
现在,对于我的每个实体,我都会制作实现通用IRepository =&gt;
的具体类public class SchoolclassRepository : IRepository<Schoolclass>
{
public void Delete(Schoolclass entity)
{
throw new NotImplementedException();
}
public void Add(Schoolclass entity)
{
throw new NotImplementedException();
}
public void Attach(Schoolclass entity)
{
throw new NotImplementedException();
}
public void Detach(Schoolclass entity)
{
throw new NotImplementedException();
}
public void SaveChanges()
{
throw new NotImplementedException();
}
}
在我的ViewModel的构造函数(mvvm模式)中,我这样做=&gt;
IRepository<Schoolclass> repo = new SchoolclassRepository();
当我在每个实体类中为我的CRUD操作编写代码时,IRepository有什么优势?
在Customer,Product,Pupil中,无论我实现IRepository<Product>
,IRepository<Customer>
,IRepository<Pupil>
等等,我实现接口的方法。
为什么我不能说=&gt;
SchoolclassRepository repo = new SchoolclassRepository(); ???
我不关心是否有可能为一个小应用程序编写单元测试。
答案 0 :(得分:4)
存储库模式基于IoC和依赖注入模式,单元测试恰好需要IoC和依赖注入才能使事情更容易测试。它最初并不打算成为编写数据访问层的另一种方式,尽管许多人发布并实现它。对于小型应用程序,它取决于您想要投入多少精力。
通常,实现SchoolclassRepository将位于与IRepository接口不同的命名空间中,因此您可以支持多个实现。 (不是规则)
您可以设置ViewModel s constructor (mvvm pattern) to take a parameter for the repository interface IRepository<Schoolclass>. Now your ViewModel
的构造函数是基于接口而不是实现。
private IRepository<Schoolclass> _repository
public ViewModel(IRepository<Schoolclass> Repository)
{ this._repository = Repository; }
为什么以上......
该模式还使未来的变更更容易。
如果您的SchoolclassRepository()实现使用ADO.NET(sqlconnections,sqlcommands ...)来访问数据,您可以稍后构建另一个使用NHibernate,Entity Framework或其他一些数据访问方法的SchoolclassRepository()。现在,您所要做的就是更改您的使用者以使用目标实现并将其注入ViewModel。
Repository repository = new ADONET.SchoolclassRepository();
or
Repository repository = new EntityFramework.SchoolclassRepository();
ViewModel viewmodel = new ViewModel(repository);
这只是快速查看用途,我建议进一步研究存储库模式以及如何使它适合您。你显然对它很感兴趣。