【发布时间】:2020-03-23 04:54:23
【问题描述】:
我有一个遵循此图的洋葱架构:
其中每个项目通过接口连接到“中心”。
现在,我处于支付网关需要存储一些数据的情况。如果它可以访问数据库,那就太棒了,但我意识到我不能直接连接它们,这会破坏“洋葱”结构! (以及 IoC 原则!)
因此,似乎解决方案是创建一个接口,我将在持久性中实现该接口,并将其传递给 PaymentGateway。这将允许它保存自己的东西。但是这个接口可能必须非常具体(即void SavePaymentGatewayCustomer(Customer customer); 或void SavePaymentGatewayCustomerPaymentMethod(PaymentMethod paymentMethod);,对我来说这也破坏了 IoC,因为持久性和“中心”都知道太多关于 PaymentGateway 的信息。
好像大家迟早都会遇到的问题,不知道你是怎么解决的。
附加信息:
解的结构是:
接口在“AbstractionLayer”项目中定义,如下所示:
public interface IUsersPersistenceHandler : IDisposable
{
/// <summary> Gets the user. </summary>
/// <param name="id">The user identifier.</param>
Result<IUser> GetUser(string id);
...
}
这些接口然后由外围项目实现:
public sealed class VolatileUserPersistenceHandler : IUsersPersistenceHandler
{
private readonly Dictionary<string, Individual> _individuals;
private readonly Dictionary<string, Organization> _organizations;
/// <inheritdoc />
public Result<IUser> GetUser(string id) { ... }
...
}
通过依赖注入,实现被注入到 API 级别,这样对外部项目一无所知,只知道接口(通过这种方式,可以轻松地将数据库持久性与易失性持久性交换. 或者支付网关可以替换为另一个,而无需重写所有内容)。
这是简单的情况。当 PaymentGateway 需要能够存储/检索自己的信息时,就会出现问题。
假设 PaymentGateway 有自己的用户定义。现在我们要将我们的用户(在 CORE 中)与网关相关联,并且我们希望将信息保存在某处。
例如,PaymentGateway 中的用户有一个string GatewayId 和string CustomerId,我们需要将它们存储在某个地方。
【问题讨论】:
-
您能否包含一些代码以更好地展示您要询问的内容?到目前为止,您的图表是您所拥有的一个很好的高水平,但我正试图掌握您遇到问题的地方。
-
@Nkosi 完成。希望这就够了。
标签: c# architecture dependencies inversion-of-control onion-architecture