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

C# 如果需要手动传递某些构造函数参数,如何使用DI的结构映射,c#,dependency-injection,inversion-of-control,structuremap,C#,Dependency Injection,Inversion Of Control,Structuremap,我面临的情况是,我的类构造函数需要两个参数。一个参数需要由调用对象手动传递,而另一个参数应该由Structuremap注入。我只想公开一个构造函数,它接受应该手动传递的参数值。我想隐藏第二个参数,因为它应该由结构映射本身处理。有人能建议怎么做吗 我有这样一个场景 public class ProcessPayments { public ProcessPayments(String accountNumber, IProcessPayments paymentProcesser)

我面临的情况是,我的类构造函数需要两个参数。一个参数需要由调用对象手动传递,而另一个参数应该由Structuremap注入。我只想公开一个构造函数,它接受应该手动传递的参数值。我想隐藏第二个参数,因为它应该由结构映射本身处理。有人能建议怎么做吗

我有这样一个场景

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 >();
}
public ProcessPayments(字符串accountNumber)
{
_AccountNumber=AccountNumber;
_ProcessPayments=ObjectFactory.GetInstance();
}

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

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

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

Steven您的回答对我来说非常有意义,但是在我目前的情况下,我将从构造函数获取的参数传递给基类的构造函数。我想我可以修改基类以在方法中使用参数,而不是构造函数。否则我可以使用工厂。你的回答很有道理。谢谢史蒂文:我有一个相关的小问题,我想请你回答,所以我不再发帖了。我认为,如果一个对象需要一些值来执行其功能,那么它应该在构造函数中公开。例如,若有一个类从某个url获取json数据,那个么可能应该通过构造函数设置url。你的回答让我思考这个方法对不对?请给出有价值的反馈。@AfrazAli:在那个例子中,url看起来像一个配置值。它在应用程序的生命周期内不会更改。你的答案对我来说非常有意义,但是在我目前的情况下,我将把从构造函数中获取的参数传递给基类的构造函数。我想我可以修改基类以在方法中使用参数,而不是构造函数。否则我可以使用工厂。你的回答很有道理。谢谢史蒂文:我有一个相关的小问题,我想请你回答,所以我不再发帖了。我认为,如果一个对象需要一些值来执行其功能,那么它应该在构造函数中公开。例如,若有一个类从某个url获取json数据,那个么可能应该通过构造函数设置url。你的回答让我思考这个方法对不对?请给出有价值的反馈。@AfrazAli:在那个例子中,url看起来像一个配置值。它在应用程序的生命周期内不会更改。您将通过构造函数传递它。