C# 依赖倒置原理在ASP.NET提供者模型中的应用

C# 依赖倒置原理在ASP.NET提供者模型中的应用,c#,asp.net,.net,oop,dependency-injection,C#,Asp.net,.net,Oop,Dependency Injection,我有一个应用程序,它使用IPaymentService处理信用卡付款。适当的实现(CreditCardPaymentComponent或CheckPaymentComponent或实现IPaymentService接口的任何其他内容)由PaymentProvider使用注入应用程序 我们还需要这些组件可用于不同的应用程序,这些应用程序可能无法访问PaymentProvider 问题是如何放置IPaymentService接口?它不能位于应用程序内部,因为有多个应用程序需要使用该服务。它不能位于服

我有一个应用程序,它使用
IPaymentService
处理信用卡付款。适当的实现(
CreditCardPaymentComponent
CheckPaymentComponent
或实现
IPaymentService
接口的任何其他内容)由
PaymentProvider
使用注入应用程序

我们还需要这些组件可用于不同的应用程序,这些应用程序可能无法访问
PaymentProvider

问题是如何放置
IPaymentService
接口?它不能位于应用程序内部,因为有多个应用程序需要使用该服务。它不能位于服务内部,因为有多个服务实现此接口。我不喜欢将接口放在它们自己的项目中,因为这样我就必须到处添加引用。还有别的解决办法吗


编辑:为了澄清这一点,使用提供商模型的目的是让我们能够支持其他开发人员,让他们能够编写实现
IPaymentService
CustomPaymentComponent
等,并与我们的应用程序无缝配合。我倾向于@Frazell的答案,但我只是想知道将
IPaymentService
PaymentComponent
放在同一个组件中是否有任何不利之处?如果您必须为此系统开发一个
CustomPaymentComponent
,那么什么对您最有意义?

您必须在需要的地方引用接口和实现代码。如果支付代码必须在许多应用程序中重复使用,我会将其分解成一个单独的库(dll)并进行适当的打包

管理额外的程序集比诉诸代码复制要容易得多,代码复制是唯一的选择。必须不惜一切代价避免重复


这取决于你的整体表现。我将在同一程序集中提供接口和基本实现(如支付程序集),并允许在边缘案例场景中使用DI在需要时交换实现。

解决方案实际上非常简单:

使用适配器模式。

您根本不允许组件实现该接口,而是基于该接口为每个组件实现适配器。在这种情况下,适配器和接口可以放在一起:

class CreditCardPaymentServiceAdapter:IPaymentService
{
私人信用卡支付服务;
公共信用卡支付服务适配器(
信用卡支付服务)
{
服务=服务;
}
//在此处执行IPaymentService并转发
//到信用卡支付服务。
}
此适配器本身不包含任何业务逻辑,只会映射/转换/适应真实的
CreditCardPaymentService
,并公开
IPaymentService
(或哪个接口适合该应用程序)


如果您有多个应用程序,可能会被迫复制这些适配器和接口。这是缺点。

图表是一种简化;我实际上有25-30个不同的PaymentComponents,所以我不认为适配器是一个选项。在这种情况下,要么使用dynamic,要么将接口放在共享程序集中。