C# 我应该把接口和实现放在哪里

C# 我应该把接口和实现放在哪里,c#,.net,oop,design-patterns,repository-pattern,C#,.net,Oop,Design Patterns,Repository Pattern,我有Domainassembly和SqlServerRepositoryassembly SqlServerRepository程序集在域程序集上有引用,域程序集在其他程序集上没有引用 Domain程序集具有接口IRepository(以及其他用于存储库的接口),因为域逻辑仅与接口类型一起工作,而不考虑具体类型 SqlServerRepository程序集实现接口IRepository(包含在域程序集中) 没关系,我可以模拟IRepository,可以使用OracleRepository实现和其

我有
Domain
assembly和
SqlServerRepository
assembly

SqlServerRepository
程序集在
程序集上有引用,
程序集在其他程序集上没有引用

Domain
程序集具有接口
IRepository
(以及其他用于存储库的接口),因为域逻辑仅与接口类型一起工作,而不考虑具体类型

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

没关系,我可以模拟
IRepository
,可以使用
OracleRepository
实现和其他

但我想我有一些架构问题

  • SqlServerRepository
    没有
    程序集就无法工作
  • 另一方面,如果我将接口放在
    SqlServerRepository
    assembly中,没有
    SqlServerRepository
    assembly,
    Domain
    将无法工作,如果我创建
    OracleServerRepository
    assembly,我也必须使用
    SqlServerRepository
    ,因为我将接口放在
    SqlServerRepository
    中,并且
    中,alredy使用它们
  • 我应该在哪里将数据库对象映射到域?在
    SqlServerRepository
    程序集中
  • 我考虑过一个只包含接口的程序集,
    Domain
    SqlServerRepository
    引用它,但我认为这对我的项目(microservice)来说是开销


    那么,我必须做什么呢?

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

    原因是存储库契约是根据域需要的功能创建和驱动的。如果没有域,您将不会有任何存储库

    没有域程序集,SqlServerRepository无法工作

    对。正如我上面所说的。如果没有域所需的功能,就不会有
    SqlServerRepository

    我应该在哪里将数据库对象映射到域?在
    SqlServerRepository
    程序集中

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


    没有任何规定SQL Server和Oracle应该使用相同的数据库模式来持久化信息。表、视图等可能因DB引擎的优缺点而异

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

    原因是存储库契约是根据域需要的功能创建和驱动的。如果没有域,您将不会有任何存储库

    没有域程序集,SqlServerRepository无法工作

    对。正如我上面所说的。如果没有域所需的功能,就不会有
    SqlServerRepository

    我应该在哪里将数据库对象映射到域?在
    SqlServerRepository
    程序集中

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


    没有任何规定SQL Server和Oracle应该使用相同的数据库模式来持久化信息。表、视图等可能因DB引擎的优缺点而异

    我建议您使用端口和适配器[六边形体系结构]来实现。以下程序集可用于微服务

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


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

    我建议您使用端口和适配器[Hexagon architecture]来实现。以下程序集可用于微服务

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


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

    我认为一个普通的项目