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

标签 c# structuremap names named-instance

在我的应用程序中,我有 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/

相关文章:

c# - 为什么使用C++而不是C#来进行驱动级编程(系统级编程)

c# - 使用 IoC 容器的合适情况?

使用 Fluent NHibernate 和 StructureMap 的每个租户的数据库

ruby - 解析人名并在 Ruby 中匹配它们

R删除列表元素的行并保留行名

c# - 在ctor中带参数的Windsor依赖注入(inject)

c# - 实例化泛型?

c# - 如何为我的服务层设计更灵活的结构

c# - 使用 StructureMap 注入(inject)相同的实例

客户姓名验证算法