Как получить имена всех именованных экземпляров в StructureMap

В моем приложении у меня есть IPolicy интерфейс и ряд конкретных реализаций. Скажем 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. Если это возможно, как бы вы это сделали? Если нет, то какой лучший обходной путь?

2 ответа

Решение

Вы можете запросить модель контейнера как:

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

НТН

Ответ @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)
                                        ;
Другие вопросы по тегам