gpt4 book ai didi

c# - 如何检索 StructureMap 中所有命名实例的名称

转载 作者:行者123 更新时间:2023-11-30 20:00:58 24 4
gpt4 key购买 nike

在我的应用程序中,我有 IPolicy 接口(interface)和许多具体实现。比方说 BasicPolicyAdvancedPolicy。我通过添加命名实例来配置 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 的答案就是您要找的。

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/

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