C# 设计要点:多态性适合我的情况吗
我的情况与以下情况类似:C# 设计要点:多态性适合我的情况吗,c#,oop,architecture,C#,Oop,Architecture,我的情况与以下情况类似: interface IAbstractPaymentService { void ProcessPayment(); } interface IPaymentGateway1Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration interface IPaymentGateway2Service : IA
interface IAbstractPaymentService { void ProcessPayment(); }
interface IPaymentGateway1Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration
interface IPaymentGateway2Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration
public abstract class PaymentProcessor
{
protected abstract void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService);
}
public class PaymentGateway1Processor : PaymentProcessor
{
protected override void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService)
{
return ThisMethodNeedsASpecializedService(abstractPaymentService as IPaymentGateway1Service) // Don't worry, I do security checks
}
public void ThisMethodNeedsASpecializedService(IPaymentGateway1Service paymentGateway1Service)
{
paymentGateway1Service.ProcessPayment();
}
}
public class PaymentGateway2Processor : PaymentProcessor
{
protected override void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService)
{
return ThisMethodNeedsASpecializedService(abstractPaymentService as IPaymentGateway2Service) // Don't worry, I do security checks
}
public void ThisMethodNeedsASpecializedService(IPaymentGateway2Service paymentGateway2Service)
{
paymentGateway2Service.ProcessPayment();
}
}
我对这种抽象不太满意,因为多态性的概念是你不关心底层类型,你只想应用某种行为。但在这里,即使我创建了PaymentProcessor工厂,每次消费者都需要调用此MethodNeedsSpecializedService(),他也需要知道底层类型以注入正确的服务
我正在考虑将服务存储在一个内部属性中,这样我就可以创建一个工厂,在创建时注入服务,而使用者不需要知道所使用的服务,因此,不需要关心底层类型。但我一直认为在属性中存储服务实例是一种不好的做法,我不确定是否应该这样做
您对此有何看法?您会采取不同的做法吗?更好的方法是通过
PaymentProcessor
costructor注入IAbstractPaymentService
。例如:
public abstract class PaymentProcessor
{
protected abstract void ThisMethodNeedsASpecializedService();
}
public class PaymentGateway1Processor : PaymentProcessor
{
private IPaymentGateway1Service paymentGateway1Service;
public PaymentGateway1Processor(IPaymentGateway1Service paymentGateway1Service){
this.paymentGateway1Service = paymentGateway1Service;
}
public void ThisMethodNeedsASpecializedService()
{
this.paymentGateway1Service.ProcessPayment();
}
}
这就是我最终所做的,所以您投票赞成:将服务存储在内部属性中。我也意识到,在这种情况下,这不应该是一个坏的做法。谢谢你的洞察力