使用Ado.Net时,此通用存储库中是否存在代码味道?

时间:2016-01-04 17:05:01

标签: c# unit-testing repository repository-pattern ddd-repositories

我一直在阅读this article以更新我对存储库模式的理解,并发现我的存储库可以是多个方法的组合,这些方法适用于使用该存储库的业务层。因此,通过这种理解,我想出了UserRepository的这个类和接口

public class UserRepo : IUserRepo 
{

    public TheUser RegisterUser(UserRegistrationDetails details)
    {
        //The details here are what is required for inserting to the user table plus a
        //few other related tables which are decided and populated at the Business layer.
    }

    //example method returning data from a combination of multiple tables
    //and a dto created specially for that purpose
    public BaggageDetails GetBaggageDetailsForUser(string username)
    {
        //implementation here
    }

    //example method returning data from a combination of multiple 
    //different tables
    public TravelDetails GetTravelDetailsForUser(string username)
    {
        //implementation here
    }


 }

这里的方法基本上返回一个自定义dto,它在每种情况下都有[Users]表的全部或部分字段,以及一些不属于{{[Users]字段的其他字段。 1}}表。

然后我遇到了关于通用存储库的this article,所以现在我的类和接口看起来像这样

public class UserRepo : IDisposable, IUserRepo, IGenericRepo<TheUser> //,IGenericRepo<Users>
{

    public TheUser RegisterUser(UserRegistrationDetails details)
    {
        //
    }

    //example method....
    public BaggageDetails GetBaggageDetailsForUser(string username)
    {
        //implementation here
    }

    //example method....
    public TravelDetails GetTravelDetailsForUser(string username)
    {
        //implementation here
    }



    //New methods added for the generic repository
    public IList<TheUser> GetAll()
    {
        //
    }

    public TheUser GetById(int id)
    {
        //
    }

    public void Save(TheUser saveThis)
    {
        //
    }

    public void Delete(TheUser deleteThis)
    {
        //
    }

    //Should I implement this here?
    public void Dispose()
    {
        //TODO
    }
}

我是否正确实现了UserRepo这样的许多接口?通用存储库具有与存储库的聚合根相关的方法(如果我使用右侧术语)。

问题

  1. 我应该将与IGenericRepo<Users>中的聚合根相关的dto或更大的dto放在更新[Users]表所需的信息之上,如上所述IGenericRepo<TheUser> < / LI>
  2. 现在,如果我出于测试目的嘲笑UserRepo,我不确定使用哪个界面
  3. 修改 除了上述问题的答案之外,我正在寻找有关创建存储库这一主题的想法。我知道这属于“它取决于”类别,但是很想听听你们对这种构建存储库的方式的看法。在现场项目中创建和使用存储库的人是什么?

1 个答案:

答案 0 :(得分:0)

如果您以通用方式处理数据,那么通用存储库才有意义。经典的存储库模式构建Get(GetAll / GetById等),创建和删除,但可能导致跳过其中一些。这很大程度上取决于你的应用。 重要的是要考虑Repository为您的数据存储创建抽象级别,以便能够用不同的数据存储替换现有的数据存储,并且您更有可能使用一些模拟数据进行测试。

在您的示例中,您实现了非常具体的用户存储库,但我无法在您的应用程序中看到您需要多少数据。因此,您似乎试图通过实现通用存储库接口来强制您的用户存储库能够执行根本不需要的操作。

如果您真的有共同的数据处理基础,我建议使用通用方法。

DTO(数据传输对象)应为您的消费者一方(例如UI)提供一个特定用例的大量数据。这实际上取决于您想要一次可视化/消费的数据量,它应该与数据传输和服务呼叫数量的成本保持平衡。