3

我有这个:

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 => 的具体类

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 模式)中,我这样做 =>

IRepository<Schoolclass> repo = new SchoolclassRepository();

当我必须在每个实体类中为我的 CRUD 操作编写代码时,IRepository 有什么优势?

在 Customer、Product、Pupil 中,我实现了、IRepository<Product>等任何类......并且我实现了接口的方法。IRepository<Customer>IRepository<Pupil>

为什么我不能说=>

SchoolclassRepository repo = new SchoolclassRepository(); ??? 

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

4

1 回答 1

4

存储库模式基于 IoC 和依赖注入模式,单元测试恰好需要 IoC 和依赖注入以使测试更容易。它最初并不打算成为编写数据访问层的另一种方式,尽管许多人都这样发布和实现它。对于小型应用程序,这取决于您要投入多少精力。

通常,实现 SchoolclassRepository 将位于与 IRepository 接口不同的命名空间中,因此您可以支持多个实现。(不是规则)

您可以将 ViewModels 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);

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

于 2010-02-18T00:59:13.607 回答