结构图 - 注入命名实例的集合

时间:2017-01-17 12:02:04

标签: c# dependency-injection structuremap

这个问题与我之前提出的问题非常相似(并已回答):Structure Map - Collection of Dependencies in Constructor

在我的注册表中,我有以下内容:

For<IMyObject>().Add<MyObjectType1>().Named("Type1");
For<IMyObject>().Add<MyObjectType2>().Named("Type2");
For<IMyObject>().Add<MyObjectType3>().Named("Type3");

我想将所有实例注入构造函数,以便我可以检索任何命名实例。示例代码(生成StructureMap异常):

public class Example
{
  private Dictionary<string, IMyObject> _workers;

  public Example(Dictionary<string, IMyObject> workers)
  {
    _workers = workers;
  }

  public void DoSomeStuff(string mode)
  {
     var worker = _workers[mode];
     worker.DoStuff();
  }
}

我对此方法的推理是允许外部配置指定应该如何处理某些内容(在上面的示例中,'mode'将对应于命名实例)。

实际例外情况如下:

StructureMap.StructureMapException occurred
  ErrorCode=202
  HResult=-2146232832
  Message=StructureMap Exception Code:  202
No Default Instance defined for PluginFamily

我知道我可以在我的方法DoSomeStuff中使用StructureMap容器​​来检索命名实例,但是,这是一种反模式。

所以澄清我的问题:

  • 我可以注入一个命名实例的字典(或其他集合),以便我可以通过名称引用它们吗?

希望这很清楚,如果需要进一步说明,请回复。

  • C#:4.0
  • StructureMap:2.5.4.0

谢谢,

格雷姆

1 个答案:

答案 0 :(得分:2)

不是注入字典,而是注入IMyObject可能更好。这可以防止StructureMap必须创建具有所有依赖关系的所有public class Example { private Func<string, IMyObject> _workers; public Example(Func<string, IMyObject> workers) { _workers = workers; } public void DoSomeStuff(string mode) => _workers(mode).DoStuff(); } 实例,而实际上只需要使用其中一个实例:

Example

您可以按如下方式注册For<Example>() .Use(() => new Example(mode => container.GetInstance<IMyObject>(instanceKey: mode)));

transition