2012-01-24 3 views
0

У меня есть хост-приложение, которое предоставляет интерфейс плагина, который может быть реализован плагинами. При инициализации плагин хостов приложение проходит в реестре StructureMap поэтому плагин может зарегистрировать вещиПолучение производного типа из зарегистрированного общего интерфейса

public interface IAppPlugin 
{ 
    void Initialize(IRegistry configure); 
} 

public class CatPlugin : IAppPlugin 
{ 
    public void Initialize(IRegistry configure) 
    { 
     configure.For<IFilter<IPet>>() 
      .Add<CatFilter<IPet>>(); 
    } 
} 

В моем принимающем приложении у меня есть реализация Ipet, FeralCat, и я хочу получить от StructureMap любых фильтров

ObjectFactory.TryGetInstance<IFilter<FeralCat>> 

Я надеялся, что это вернет мне CatFilter фильтр, зарегистрированный мой плагин, но оно не (что имеет смысл, на самом деле, я гавань зарегистрирован тип соответствия)

Мой плагин не знает о FeralCat, как я могу настроить StructureMap вернуть CatFilter?

ответ

1

Вы должны взглянуть на Advanced StructureMap: connecting implementations to open generic types, это может быть полезно в вашем случае.

Но для конкретного кода:

var container = new Container(); 

container.Configure(
    x => 
    {      
     x.For(typeof(IPet)).Use(typeof(FeralCat)); 
     x.For(typeof(IFilter<>)).Use(typeof(CatFilter<>)); 
    }); 

var instances = container.GetAllInstances<IFilter<FeralCat>>(); 

Даст вам экземпляр CatFilter<FerelCat>.

+0

спасибо за ваш ответ, но я уже пробовал это, и structmap выбрасывает «элемент с тем же ключом уже добавлен », поскольку аргумент CatFilter является общим (хотя и ограниченным), а не интерфейсом ... public class CatFilter : IFilter где TModel: IPet – Dve

+0

Я действительно пробовал это в тесте, определяя CatFilter точно так же, как вы. Оно работает. В вашем коде должно быть что-то большее, что дает вам исключение. – doblak

Смежные вопросы