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

时间:2013-09-26 10:54:02

标签: c# dependency-injection inversion-of-control structuremap

我面临的情况是我的Class构造函数需要2个参数。一个参数需要由调用对象手动传递,而另一个参数应该由Structuremap注入。我想只公开一个带有应该手动传递的参数值的构造函数。我想隐藏第二个参数,因为它应该由Structure map本身处理。任何人都可以建议如何做到这一点。

我有这样的场景

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

我想只使用第一个参数

来公开构造函数
var P = new ProcessPayments("123");

我希望Structure Map根据我的配置自动为我注入IProcessPayments依赖项。

我怎样才能做到这一点?

我可以在构造函数中执行类似的操作

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

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

1 个答案:

答案 0 :(得分:1)

似乎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);
    }
}