具体的IRepository <t> vs Repository如果我不用模拟进行单元测试</t>

时间:2010-02-17 22:56:45

标签: c# repository irepository

我有这个:

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(); ??? 

我不关心是否有可能为一个小应用程序编写单元测试。

1 个答案:

答案 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);

这只是快速查看用途,我建议进一步研究存储库模式以及如何使它适合您。你显然对它很感兴趣。