C# 确定不使用构造函数中的所有参数吗?-重游
此类在构造函数中注入所有依赖项,但一次只使用其中一个依赖项。这被认为是糟糕的设计吗C# 确定不使用构造函数中的所有参数吗?-重游,c#,constructor,C#,Constructor,此类在构造函数中注入所有依赖项,但一次只使用其中一个依赖项。这被认为是糟糕的设计吗 public class OrderPayment { ICreditCardPayment _ccPayment; ICashPayment _cashPayment; public OrderPayment(ICreditCardPayment ccPayment, ICashPayment cashPayment) { _ccPayment = ccPaym
public class OrderPayment
{
ICreditCardPayment _ccPayment;
ICashPayment _cashPayment;
public OrderPayment(ICreditCardPayment ccPayment, ICashPayment cashPayment)
{
_ccPayment = ccPayment;
_cashPayment = cashPayment;
}
private void PrepareOrder(Order order)
{
// Do stuff with the order
}
public PaymentResult PayByCreditCard(Order order)
{
PrepareOrder(order);
return _ccPayment.Pay(order);
}
public PaymentResult PayByCreditCard(Order order)
{
PrepareOrder(order);
return _cashPayment.Pay(order);
}
}
另一种选择是:
public class OrderPayment
{
private void PrepareOrder(Order order)
{
// Do stuff with the order
}
public PaymentResult PayByCreditCard(Order order, ICreditCardPayment ccPayment)
{
PrepareOrder(order);
return ccPayment.Pay(order);
}
public PaymentResult PayByCreditCard(Order order, ICashPayment cashPayment)
{
PrepareOrder(order);
return cashPayment.Pay(order);
}
}
这个函数调用有点复杂。即使不是每个构造函数参数都被使用,您会使用第一个看起来更干净的吗?考虑到DI框架必须实例化可能很重的类,即使它们可能没有全部被使用,我不确定这有多好
那么你会用哪一个呢?或者可能是一个不同的实现?我将从
ICashPayment
和ICreditCardPayment
重构或提取一个公共接口。您的代码示例表明,您的方法都在调用xPayment.Pay
,这看起来很适合您的通用接口方法
public interface IPayment
{
PaymentResult Pay(Order order);
}
更专业化的接口可以继承并构建在它之上
通常,我会避免让构造函数(或任何方法)接受未使用的参数,或者如果使用了一个参数,则另一个不使用。这通常表示您没有在适当的抽象级别上操作,或者您的类/方法有太多的职责。您需要一个需要以下所有功能的操作:
- 付款方式
- 支付的金额
- 正在付款的订单
- 根据订单和支付金额,付款前需要进行哪些处理
public PaymentResult Pay(Amount amount, Order order, IOrderService orderService,
IPaymentService paymentService) {
var updatedOrder = orderService.Process(order); // don't alter the original in
// case you need to roll back
var result = paymentService.Pay(amount, updatedOrder);
return result; // this result should include the updated order, so that the system
// can determine what to do upon successful payment
}
我在这里问了一个非常类似的问题: