如果需要手动传递某些构造函数参数,如何使用 DI 的结构映射

本文关键字:参数 何使用 DI 映射 结构 构造函数 如果 | 更新日期: 2023-09-27 18:32:49

>我面临着我的类构造函数采用 2 个参数的情况。一个参数需要由调用对象手动传递,而另一个参数应由结构图注入。我只想公开一个接受应手动传递的参数值的构造函数。我想隐藏第二个参数,因为它应该由结构图本身处理。谁能建议如何做到这一点。

我有这样的场景

public class ProcessPayments
{
    public ProcessPayments(String accountNumber, IProcessPayments paymentProcesser)
    {
        ...
    }
}

我想像这样只用第一个参数公开构造函数

var P = new ProcessPayments("123");

我希望结构图根据我的配置自动为我注入 IProcessPayments 依赖项。

我怎样才能做到这一点?

我可以在我的构造函数中做这样的事情

public ProcessPayments(String accountNumber)
{
    _AccountNumber = accountNumber;
    _ProcessPayments = ObjectFactory.GetInstance<IProcessPayments >();
}

但这意味着现在我依赖于结构图本身,我不喜欢这个选项。还有其他优雅的解决方案吗?

如果需要手动传递某些构造函数参数,如何使用 DI 的结构映射

似乎accountNumber是一个运行时依赖项/值(它可以从一个调用到另一个调用)。不要将运行时值与编译/注册时依赖项混合使用。而是使用方法传递accountNumber

public class ProcessPayments
{
    public ProcessPayments(IProcessPayments paymentProcesser) { ... }
    public void Process(String accountNumber) { ... }
}

或者,如果这不合适,请创建一个工厂:

public class ProcessPaymentsFactory : IProcessPaymentsFactory
{
    public ProcessPaymentsFactory(IProcessPayments paymentProcesser) { ... }
    public ProcessPayments Create(String accountNumber)
    {
        return new ProcessPayments(accountNumber, this.paymentProcesser);
    }
}