【问题标题】:How to retrieve the names of all the named instances in StructureMap如何在 StructureMap 中检索所有命名实例的名称
【发布时间】:2013-11-05 18:20:49
【问题描述】:

在我的应用程序中,我有IPolicy 接口和一些具体的实现。假设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 中找不到它。如果可能,你会怎么做?如果不是,最好的解决方法是什么?

【问题讨论】:

    标签: c# structuremap names named-instance


    【解决方案1】:

    @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)
                                            ;
    

    【讨论】:

    • 确实,我接受了第一个答案,但你的答案也包含有用的信息,所以我加了)
    【解决方案2】:

    您可以像这样查询容器模型:

    var policyNames =  Container.Model.AllInstances.Where(x => x.PluginType == typeof(IPolicy)).Select(x => x.Name);
    

    HTH

    【讨论】:

    • 太棒了。正是我想要的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多