我在使用 Clean Architecture 实现一个简单的测试应用程序时遇到了麻烦。
描述测试应用,它是一个销售系统的模拟,用例单一,分为3个包(DLL,用C#制作):
在Sales.Business包(黄色和粉色圆圈)中,我们将有:
在Sales.Adapters包(绿色圆圈)中,我们将有:
在Sales.Infrastructure包(蓝色圆圈)中,我们将有:
这就是问题开始的地方。
“StartOrder”用例需要访问 OrderRepository 来保存开始的订单。
因为这会违反 Clean Architecture 依赖规则(高层元素访问低层元素),这种访问是通过使用 IPedidoRepository 接口的依赖倒置来完成的。
所以我们有以下参考资料:
StartOrderUseCase --> IPedidoRepository
IPedidoRepository 接口是这样的:
namespace Sales.Adapters;
public interface IOrderRepository
{
...
int SaveOrder(Order order);
...
}
注意接口引用了域实体“Order”(从依赖规则的角度来看这是可以接受的),但这会在项目中造成循环引用问题,因为我们有:
Sales.Business references Sales.Adapters
我们有:
Sales.Adapters references Sales.Business
如果我用这样的 OrderDTO 替换此接口中的 Order 类...
namespace Sales.Adapters;
public interface IOrderRepository
{
...
int SaveOrder(OrderDTO order);
...
}
...问题是一样的,因为 DTO 需要在 Sales.Adapters 包和 Sales.Business 包中使用。无论我把这个 OrderDTO 放在哪里,总会有一个循环引用。
有谁知道如何解决这个问题?
当您需要组合类/接口时,任何 C#“体系结构”都会出现问题,因此常见问题如下所示:
C
| \
A B
假设您希望您的代码更改尽可能少,所以如果创建了库 - 您想要开发一次并只应用小错误修复。所以在我们的例子中,A 和 B 现在被锁定以进行修改。我们创建新类型 C 的唯一方法是创建单独的库来保存 C.
总而言之,生产中的这个“问题”是通过以下方式解决的:
附言 我还没有找到这种方法不起作用的地方。到目前为止,我处理过的所有项目都没有崩溃,通常都是这样拆分的。
PS 2 不要试图将业务层拆分成多个库,否则你会遇到同样的问题,以后更难解决。