2

我的代码中有以下配置,其中视图配置为 IWorkflowModule:

 dependencyContainer.RegisterType<IWorkflowModule, StartView>();

我想将所有这些 IWorkflowModule 实现作为另一个类的构造函数参数。此类在模块注册后实例化。

  public WorkflowConfigReader(Lazy<List<IWorkflowModule>>
                                        availableWorkflowModules)
  {
      this.availableWorkflowModules = availableWorkflowModules;
  }

构造函数的参数是 Lazy,因为稍后我将使用这些模块,并希望确保它们之前已注册。我还需要它们作为列表来获取所有模块。

不幸的是,如果我这样做,我会得到一个空列表。我不确定,但我猜 Unity 不支持未静态配置的 IEnumerable 的依赖注入。它是否正确?有什么解决方案吗?

谢谢你。

4

1 回答 1

3

当请求 a 时,您需要告诉 Unity 您想要什么List<IWorkflowModule>。因此,您可以执行以下操作:

IUnityContainer container = new UnityContainer();

// Default registration if required
container.RegisterType<IWorkflowModule, StartView>();

// IEnumerable Registration 
container.RegisterType<IWorkflowModule, StartView>("WorkflowConfigReaderItem1");
container.RegisterType<IWorkflowModule, EndView>("WorkflowConfigReaderItem2");
container.RegisterType<List<IWorkflowModule>>(new InjectionFactory(c =>
    {
        return c.ResolveAll<IWorkflowModule>().ToList();
    }));

Unity 确实知道如何解析数组,因此如果您要使用数组,IWorkflowModule则不必注册 InjectionFactory:

public WorkflowConfigReader(Lazy<IWorkflowModule[]>
                        availableWorkflowModules)
{
    this.availableWorkflowModules = availableWorkflowModules;
}

// Default registration if required
container.RegisterType<IWorkflowModule, StartView>();

container.RegisterType<IWorkflowModule, StartView>("WorkflowConfigReaderItem1");
container.RegisterType<IWorkflowModule, EndView>("WorkflowConfigReaderItem2");

var configReader = container.Resolve<WorkflowConfigReader>();
于 2013-10-20T19:31:35.130 回答