这个问题与我之前提出的问题非常相似(并已回答):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容器来检索命名实例,但是,这是一种反模式。
所以澄清我的问题:
希望这很清楚,如果需要进一步说明,请回复。
谢谢,
格雷姆
答案 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