在我的应用程序中,我有 IPolicy
接口(interface)和许多具体实现。比方说 BasicPolicy
和 AdvancedPolicy
。我通过添加命名实例来配置 StructureMap 容器,如下所示:
class MyRegistry : Registry
{
public MyRegistry()
{
For<IPolicy>().Use<BasicPolicy>().Named("Basic policy");
For<IPolicy>().Use<AdvancedPolicy().Named("Advanced policy");
}
}
我还有一个工厂来按名称检索策略:
class PolicyFactory : IPolicyFactory
{
private readonly IContainer _container;
public PolicyFactory(IContainer continer)
{
_container = container;
}
public IPolicy GetPolicy(string name)
{
return _container.GetInstance<IPolicy>(name);
}
}
现在我想在工厂中拥有一个返回所有名称 列表的方法。这样当我调用 var names = _factory.GetPolicyNames()
时,names
变量将保存 { "Basic policy", "Advanced policy"}
.
有了这个,我可以将列表传递到表示层以将其显示在一个组合框中,用户可以在其中选择要应用的策略。然后,调用链将返回到 _factory.GetPolicy(name);
我没能在 StructureMap 中找到它。如果可能的话,你会怎么做?如果不是,最好的解决方法是什么?
最佳答案
@ozczecho 的答案就是您要找的。p>
StructureMap 中的每个实例都有一个名称,即使您没有明确命名的实例也是如此。如果未指定名称,StructureMap 使用 Guid 字符串来标识实例。
如果要过滤掉带Guid字符串的实例,改成下面的代码:
Predicate<string> isGuid = s =>
{
Guid g;
return Guid.TryParse(s, out g);
};
var names = _container.Model.AllInstances.Where(x => x.PluginType == typeof (IPolicy))
.Where(x => !isGuid(x.Name))
.Select(x => x.Name)
;
关于c# - 如何检索 StructureMap 中所有命名实例的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795980/