在域和存储库之间共享实用程序对象

时间:2011-08-18 13:45:54

标签: c# .net design-patterns domain-driven-design repository

我目前正在构建一个使用MySQL数据库的框架。我无法使用实体框架的MySQL实现,所以我试图找出推广搜索和分页功能的最佳方法。

最简单的解决方案是使用具有签名的存储库方法,例如:

IList<Blah> GetSomething(string _query, 
                         int _page, 
                         int _pageSize, 
                         out int _numPages)

但这似乎有点反OOD。

我的想法是使用ISearchParameterIPaging对象创建一个实用程序DLL,域级别和存储库级别都可以访问,这样可以避免重新创建这两个接口和实现它们在每个域和存储库中。

public interface ISearchParameters
{
    Direction Direction { get; set; }
    string DirectionField { get; set; }
    string Query { get; set; }
    IList<string> SearchFields { get; set; }
}

public interface IPaging
{
    int CurrentPage { get; set; }
    int PageSize { get; set; }
    int NumberOfPages { get; set; }

    int GetQueryPage();
}

我通常将DTO从存储库映射到域对象,但如果两个级别都引用了这个实用程序.dll,那么在没有映射的情况下在这两个级别之间传递ISearchParameter对象会不好?如果是的话,还有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

  1. 使用存储库模式抽象出与数据访问层的交互。
  2. 使用Inversion of Control容器创建存储库,以避免从域引用到数据访问层。
  3. 然后,数据访问可以保存对您的域类或域类工厂的引用 - 避免使用DTO(遵循DRY原则)。
  4. 将您的界面设计为无状态。当交叉层(可能成为层)时,请考虑服务而不是对象。这比较简单。
  5. 避免使用utility.dll。您实际上只需要在域和数据访问层之间共享存储库接口。您可以将它们放在域程序集中,或者更好的是单独的程序集。

答案 1 :(得分:0)

在我看来,这是一个非常合适的解决方案。在我的项目中,我经常使用jqGrid,其中还包括搜索,排序和分页。我使用gridParameters对象(在我的基础结构层中定义),该对象从控制器(UI)传递到业务层和数据层。 这些对象不包含任何业务规则,因此我认为这种方法没有任何问题。