Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定不使用构造函数中的所有参数吗?-重游_C#_Constructor - Fatal编程技术网

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
}

我在这里问了一个非常类似的问题: