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

时间:2011-06-20 05:38:35

标签: .net dependency-injection inversion-of-control structuremap

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

var arg = (x == y) ? z : a;
ObjectFactory.GetInstance<IRepository>(arg);

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

如何做到这一点?

3 个答案:

答案 0 :(得分: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(...);
    }
}

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

For<Func<ArgumentType, IRepository>>().Use( arg => new Repository(arg));

答案 1 :(得分:1)

我认为这样的事情应该有效:

var arg = (x == y) ? z : a;
ObjectFactory.With("argumentName").EqualTo(arg).GetInstance<IRepository>();

答案 2 :(得分:1)

创建IRepositoryFactory并注册并解决该问题,而不是解析IRepository。这将使您不必直接从应用程序中调用容器。这应该是prevented不惜一切代价。