在构造新类型时如何将动态参数传递给Structuremap?

Rom*_*man 4 .net structuremap dependency-injection inversion-of-control

在我的应用程序中有些情况我的存储库需要将不同的参数传递给具体类型的构造函数.我希望能够做到这样的事情:

var arg = (x == y) ? z : a;
ObjectFactory.GetInstance<IRepository>(arg);
Run Code Online (Sandbox Code Playgroud)

参数只能在创建Repository实例时根据某些条件构造.

如何才能做到这一点?

PHe*_*erg 7

作为@Steven也说,我认为,如果可能的话,你应该让需要的依赖(即具有动态参数)的类需要一个工厂作为参数,这样就可以控制从消费者的创建.

有了结构图,内置了对此的支持,因此您没有构建工厂类.

让消费者将Func作为ctor参数,并通过使用参数调用Func来创建存储库(依赖项):

public class Consumer
{
    public Consumer(Func<ArgumentType, IRepository> repositoryFactory)
    {
      _repositoryFactory = repositoryFactory;
    }

    public void CallRepository()
    {
       ArgumentType arg = (x == y) ? z : a;
       var repository = _repositoryFactory(arg);
       repository.GetById(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

在结构图的配置中,您可以配置func:

For<Func<ArgumentType, IRepository>>().Use( arg => new Repository(arg));
Run Code Online (Sandbox Code Playgroud)