我目前正在学习DDD,在我的示例项目中,我对架构有一些疑问。
现在,我有这个:
WPF应用程序(引用位于单独程序集中的服务代理) - > 服务(代理来自哪里)引用 - > 然后访问的域层(包含域对象和存储库接口) - > DAL(实现存储库)
问题:
我知道答案取决于具体情况,但一般来说,这个架构是否在正确的路径中假设需要所有层?
这是我第一次使用存储库模式,现在,我的服务有一个接受IRepository的构造函数。注射在哪里进行?服务层是否应包含应使用哪个存储库的配置文件?这意味着,服务层是否引用了域层中的存储库接口及其在DAL中的实现?
WPF应用程序引用服务代理,因此不会生成具有IRepository参数的构造函数。假设我决定直接从WPF使用服务(没有服务代理),如何使用来自UI的IRepository参数实例化服务?我需要添加一个包含存储库实现的DAL的引用?这样可以正确吗?
此外,此设计还意味着DAL应该知道IRepository接口(因为它们将实现接口)以及将使用存储库实现的服务层。但我的存储库接口位于域层; DAL需要引用域层来获取那些我认为错误的接口,因为我引用了上游。我该怎么做?
答案 0 :(得分:1)
我知道答案取决于具体情况,但一般来说,这个架构是否在正确的路径中假设需要所有层?
对我来说非常标准。您知道,层次结构会增加复杂性。确保应用程序足够大,以充分利用多层体系结构。
此外,如果要按装配分隔图层,请确保它们在逻辑上也是分开的。分离程序集(与逻辑分离的联系)是指您可以在不影响或修改系统其余部分的情况下分离一个项目的开发。
注射在哪里?
在最高层,您的作品根。在这种情况下你的WPF应用程序。
服务层是否应包含应使用哪个存储库的配置文件?
决定使用哪个具体的存储库应该在组合根目录中进行,将决策放在配置文件中意味着额外的灵活性,但这也意味着额外的复杂性。是否需要这样做?
这意味着,服务层是否引用了域层中的存储库接口及其在DAL中的实现?
仅域中的存储库接口。不是实施。它不需要。不要那样做。
如何使用UI中的IRepository参数实例化服务?我需要添加一个包含存储库实现的DAL的引用?那是正确的还是正确的?
是。您的WPF是您的组合根,它需要所有引用,以便它可以构建您的体系结构。
此外,这种设计还意味着DAL应该知道IRepository接口(因为它们将实现接口)以及将使用存储库实现的服务层。
为什么DAL会引用服务层?它不需要。不要那样做。
但我的存储库接口位于域层; DAL需要引用域层来获取那些我认为错误的接口,因为我正在引用上游。我该怎么做?
您没有引用上游,请参阅https://stackoverflow.com/a/24241373/1027250