Unity Container - динамический переход в T к методу Resolve - PullRequest
7 голосов
/ 13 июля 2009

Я создал интерфейс ISearchable, который я набрал, чтобы я мог получить IEnumerable из T для результатов.

У меня есть ряд служб, которые реализуют ISearchable для разных объектов домена ...

Container.RegisterType<ISearchable<Animal>, AnimalService>();
Container.RegisterType<ISearchable<Fish>, FishService>();

Я хочу разрешить (через Unity) ISearchable в зависимости от типа, но изо всех сил пытаюсь заставить его работать ...

Следующее не компилируется, но, надеюсь, даст представление о том, чего я пытаюсь достичь.

Type t = typeof(Animal);
var searchProvider = _container.Resolve<ISearchable<t>>();

Любая помощь с благодарностью получена!

Спасибо

Andy

Ответы [ 3 ]

12 голосов
/ 15 июля 2009

Наконец-то разобрались, надеюсь, это поможет кому-то еще!

var type = filter.GetType();
var genericType = typeof(ISearchable<>).MakeGenericType(type);
var searchProvider = _unityContainer.Resolve(genericType);
2 голосов
/ 13 июля 2009

Почему бы не зарегистрировать ваши типы по имени и решить таким образом?

Container.RegisterType<ITelescopeView, TelescopeView>("type1");
Container.RegisterType<ITelescopeView, TelescopeView2>("type2");

Container.Resolve(ITelescopeView, "type1");

Если вы хотите, чтобы ваши имена могли быть просто полным именем типа или вы могли бы использовать что-то еще. Подход Дмитрия тоже сработает. Но это может привести к более четкому коду.

0 голосов
/ 13 июля 2009

Как насчет ...

var sp = container.Resolve(
Type.GetType("ISearchable`1[" + yourGenericTypeHere + "]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...