gpt4 book ai didi

c# - 带有 Lazy> 的 Microsoft Unity 3.0 DI 不起作用

转载 作者:行者123 更新时间:2023-11-30 22:12:53 28 4
gpt4 key购买 nike

我的代码中有以下配置,其中一个 View 被配置为 IWorkflowModule:

 dependencyContainer.RegisterType<IWorkflowModule, StartView>();

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

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

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

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

谢谢。

最佳答案

List<IWorkflowModule> 出现时,您需要告诉 Unity 您想要什么被要求。所以你可以这样做:

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>();

关于c# - 带有 Lazy<List<IFoo>> 的 Microsoft Unity 3.0 DI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19481364/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com