Domain driven design 域驱动设计:基础设施或存储库可以使用域对象吗?

Domain driven design 域驱动设计:基础设施或存储库可以使用域对象吗?,domain-driven-design,Domain Driven Design,考虑到域驱动的设计,基础设施或系统可以使用域的对象(值、实体等),还是应该应用依赖倒置,以便基础设施只依赖于自身定义的接口 存储库呢?它是否同样适用 它是否违反了基础架构、存储库或系统代码(取决于域) (A) 基础结构依赖于域的示例代码: namespace Infrastrcuture { public class Sender { public void Send (Domain.DataValue data) { ... } } } namespace I

考虑到域驱动的设计,基础设施或系统可以使用域的对象(值、实体等),还是应该应用依赖倒置,以便基础设施只依赖于自身定义的接口

存储库呢?它是否同样适用

它是否违反了基础架构、存储库或系统代码(取决于域)

(A) 基础结构依赖于域的示例代码:

namespace Infrastrcuture {
    public class Sender {
        public void Send (Domain.DataValue data) { ... }
    }
}
namespace Infrastrcuture {
    public interface ISendableData {
        ...
    }
    public class Sender {
        public void Send (ISendableData data) { ... }
    }
}
(B) 基础结构不依赖于域的示例代码:

namespace Infrastrcuture {
    public class Sender {
        public void Send (Domain.DataValue data) { ... }
    }
}
namespace Infrastrcuture {
    public interface ISendableData {
        ...
    }
    public class Sender {
        public void Send (ISendableData data) { ... }
    }
}

一般来说,如果您的基础架构依赖于您的域,我会说这没关系。另一种方法不是个好主意

这样想:什么东西在某个时候更有可能被取代?基础设施还是领域


基础设施将随着时间的推移而变化(不同的提供商、不同的服务器等)。另一方面,您的域将始终存在

如果您在设计时考虑到基础设施可以依赖于域(通过
使用
关键字),您如何避免循环依赖?因为域将使用依赖于域的基础设施服务。那么,域应该依赖于基础设施的接口,而不是基础设施本身。与中一样,域定义了它需要的接口,然后您为该接口提供了一个实现。域将声明它需要的服务的接口,然后基础设施、存储库等将实现它?现在我觉得这很有道理。您选择这种接口实现的方法是什么?依赖注入?将实现传递给构造函数?全局配置上下文?依赖项注入。更详细地解释了这种方法。@FelipeLavratti我很难理解使用DI或将实现传递给构造函数是什么意思。我想你可能在想一些不太好的东西,如果你能分享一些代码就好了。通常,您的域在任何意义上都不需要了解基础设施,甚至不需要通过自己的接口和构造函数注入。例如,存储库知道如何持久化实体,但实体对存储库和持久化一无所知。