我应该在哪里放置接口和实现
Where should I put interfaces and implementations
我有 Domain
个程序集和 SqlServerRepository
个程序集。
SqlServerRepository
程序集引用了 Domain
程序集,Domain
程序集没有引用其他程序集。
Domain
程序集有接口 IRepository
(以及存储库的其他接口),因为域逻辑只适用于接口类型,不考虑具体类型。
SqlServerRepository
程序集实现接口 IRepository
(包含在 Domain
程序集中)。
没关系,我可以模拟 IRepository
,可以使用 OracleRepository
实现和另一个...
但我觉得我有一些架构问题...
SqlServerRepository
没有 Domain
程序集就无法工作
- 另一方面,如果我将接口放在
SqlServerRepository
程序集中,没有 SqlServerRepository
程序集,Domain
将无法工作,如果我创建 OracleServerRepository
程序集,我也必须使用 SqlServerRepository
,因为我将接口放在 SqlServerRepository
中,Domain
已经使用了它们。
- 我应该在哪里将数据库对象映射到域?在
SqlServerRepository
或 Domain
程序集中?
我考虑过一个仅包含接口的程序集,Domain
和 SqlServerRepository
引用了它,但我认为这对我的项目(微服务)来说是开销
那么,我必须做什么?
存储库接口属于域(或者更确切地说,您的服务所在的域,但它们通常是域的一部分)。
原因是存储库合约是根据域所需的功能创建和驱动的。没有域,您将没有任何存储库。
SqlServerRepository can't work without the Domain assembly
正确。正如我上面所说。如果不是域所需的功能,您将不会拥有 SqlServerRepository
。
Where should I map database objects to domain? In the SqlServerRepository
or in the Domain
assembly?
在存储库程序集中,因为它是特定数据层抽象的实现细节。如果您将它们放在域中,域将被迫了解您正在使用的每个持久层(如 oracle、sqlserver、文件或其他)的实现细节。
没有人说 SQL Server 和 Oracle 应该使用相同的数据库模式来保存信息。表、视图等可能会有所不同,具体取决于数据库引擎具有的 pros/cons。
我建议您使用端口和适配器 [六角形架构] 来实现。以下汇编可以用于微服务
- Core.Domain : 你可以把所有领域对象放在这里。
- Common.ServiceContracts : 它可以包含不同服务的所有服务合同。
- MyService:它有服务实现 class。它还将具有基础设施的接口。基础设施可以是数据库、日志记录等。您可以公开接口以将域转换为基础设施对象,例如IDomain1Mapper.
- 基础架构:它可以有 class,如 SQLDomain1Mapper、OracleDomain1Mapper 等。他们都将实现 IDomain1Mapper。其他域也是如此 classes.
MyService 程序集将引用 Common.ServiceContracts、Infrastructure 和 Core.Domain。
您可以根据需要模拟 MyService 程序集中的任何 repository/domain。服务使用者可以使用 MyService 程序集。
我有 Domain
个程序集和 SqlServerRepository
个程序集。
SqlServerRepository
程序集引用了 Domain
程序集,Domain
程序集没有引用其他程序集。
Domain
程序集有接口 IRepository
(以及存储库的其他接口),因为域逻辑只适用于接口类型,不考虑具体类型。
SqlServerRepository
程序集实现接口 IRepository
(包含在 Domain
程序集中)。
没关系,我可以模拟 IRepository
,可以使用 OracleRepository
实现和另一个...
但我觉得我有一些架构问题...
SqlServerRepository
没有Domain
程序集就无法工作- 另一方面,如果我将接口放在
SqlServerRepository
程序集中,没有SqlServerRepository
程序集,Domain
将无法工作,如果我创建OracleServerRepository
程序集,我也必须使用SqlServerRepository
,因为我将接口放在SqlServerRepository
中,Domain
已经使用了它们。 - 我应该在哪里将数据库对象映射到域?在
SqlServerRepository
或Domain
程序集中?
我考虑过一个仅包含接口的程序集,Domain
和 SqlServerRepository
引用了它,但我认为这对我的项目(微服务)来说是开销
那么,我必须做什么?
存储库接口属于域(或者更确切地说,您的服务所在的域,但它们通常是域的一部分)。
原因是存储库合约是根据域所需的功能创建和驱动的。没有域,您将没有任何存储库。
SqlServerRepository can't work without the Domain assembly
正确。正如我上面所说。如果不是域所需的功能,您将不会拥有 SqlServerRepository
。
Where should I map database objects to domain? In the
SqlServerRepository
or in theDomain
assembly?
在存储库程序集中,因为它是特定数据层抽象的实现细节。如果您将它们放在域中,域将被迫了解您正在使用的每个持久层(如 oracle、sqlserver、文件或其他)的实现细节。
没有人说 SQL Server 和 Oracle 应该使用相同的数据库模式来保存信息。表、视图等可能会有所不同,具体取决于数据库引擎具有的 pros/cons。
我建议您使用端口和适配器 [六角形架构] 来实现。以下汇编可以用于微服务
- Core.Domain : 你可以把所有领域对象放在这里。
- Common.ServiceContracts : 它可以包含不同服务的所有服务合同。
- MyService:它有服务实现 class。它还将具有基础设施的接口。基础设施可以是数据库、日志记录等。您可以公开接口以将域转换为基础设施对象,例如IDomain1Mapper.
- 基础架构:它可以有 class,如 SQLDomain1Mapper、OracleDomain1Mapper 等。他们都将实现 IDomain1Mapper。其他域也是如此 classes.
MyService 程序集将引用 Common.ServiceContracts、Infrastructure 和 Core.Domain。
您可以根据需要模拟 MyService 程序集中的任何 repository/domain。服务使用者可以使用 MyService 程序集。