Получение производного типа от зарегистрированного универсального интерфейса - PullRequest
0 голосов
/ 24 января 2012

У меня есть хост-приложение, которое предоставляет интерфейс плагина, который может быть реализован плагинами.При инициализации плагинов приложение хоста передается в реестр 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 и я хочу получить из structmap любые фильтры

ObjectFactory.TryGetInstance<IFilter<FeralCat>>

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

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

1 Ответ

1 голос
/ 24 января 2012

Вы должны взглянуть на Advanced StructureMap: подключение реализаций для открытия универсальных типов , это может быть полезно в вашем случае.

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

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>.

...