我应该在哪里放置接口和实现

时间:2016-03-14 11:17:33

标签: c# .net oop design-patterns repository-pattern

我有Domain汇编和SqlServerRepository汇编。

SqlServerRepository程序集有关于Domain程序集的引用,Domain程序集没有引用其他程序集。

Domain程序集具有接口IRepository(以及其他存储库),因为域逻辑仅适用于接口类型,并且不考虑具体类型。

SqlServerRepository程序集实现接口IRepository(包含在Domain程序集中)。

没关系,我可以模仿IRepository,可以使用OracleRepository实施和其他...

但我认为我有一些架构问题......

  1. SqlServerRepository无法在没有Domain汇编
  2. 的情况下工作
  3. 另一方面,如果我将接口放在SqlServerRepository程序集中,Domain将无法在没有SqlServerRepository程序集的情况下工作,如果我创建OracleServerRepository程序集,我必须使用SqlServerRepository也是,因为我将接口放在SqlServerRepositoryDomain alredy中使用它们。
  4. 我应该在哪里将数据库对象映射到域?在SqlServerRepositoryDomain汇编中?
  5. 我想过一个只包含接口的程序集,而DomainSqlServerRepository引用它,但我认为这是我项目的开销(微服务)

    那么,我该怎么办?

2 个答案:

答案 0 :(得分:4)

存储库接口属于域(或者更确切地说,属于您的服务,但它们通常是域的一部分)。

原因是存储库合同是根据域所需的功能创建和驱动的。没有域名,您就没有任何存储库。

  

没有域程序集

,SqlServerRepository无法工作

正确。正如我上面所说的那样。如果不是域名所需的功能,则不会有SqlServerRepository

  

我应该将数据库对象映射到域?在SqlServerRepositoryDomain汇编中?

在存储库程序集中,因为它是特定数据层抽象的实现细节。如果您将它们放在域中,那么域将被迫了解您正在使用的每个持久层的实现细节(如oracle,sqlserver,files或其他)。

没有什么说SQL Server和Oracle应该使用相同的数据库模式来保存信息。表,视图等可能会有所不同,具体取决于数据库引擎的优缺点。

答案 1 :(得分:0)

我建议你使用端口和适配器[六边形架构]来实现。组装后可以用于微服务

  1. Core.Domain:您可以将所有域对象放在此处。
  2. Common.ServiceContracts:它可以包含不同服务的所有服务合同。
  3. MyService:它有服务实现类。它还将具有基础设施接口。基础设施可以是数据库,日志等。您可以公开接口以将域转换为基础设施对象,例IDomain1Mapper。
  4. 基础设施:它可以有类似SQLDomain1Mapper,OracleDomain1Mapper等类。他们都将实现IDomain1Mapper。其他域类的情况也是如此。
  5. MyService程序集将引用Common.ServiceContracts,Infrastructure和Core.Domain。

    您可以根据需要模拟MyService程序集中的任何存储库/域。服务使用者可以使用MyService程序集。