2

在我的应用程序中,我有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 中找不到它。如果可能,你会怎么做?如果没有,最好的解决方法是什么?

4

2 回答 2

4

@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)
                                        ;
于 2013-11-06T13:54:30.933 回答
3

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

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

高温高压

于 2013-11-05T22:51:56.220 回答