Ninject в приложении MVC 3 с помощью службы разрешения DependencyResolver по строке - PullRequest
0 голосов
/ 22 июня 2011

Я хотел бы использовать возможности Ninject для работы с DependencyResolver, чтобы я мог сделать что-то вроде этого:

string contentType = "Page";
IContentRepository<contentType> repository = System.Web.Mvc.DependencyResolver.Current.GetService<IContentRepository<contentType>>();

contentType является динамическим, поэтому может быть любым (из нескольких вариантов)и я не хочу писать if..else.. Очевидно, что выше не работает.Я должен как-то получить Type из строки.IContentRepository является универсальным и принимает типы, производные от класса ContentBase, что делает Page (в приведенном выше примере).

В MVC 2 со старым Ninject я делал это через фабрику пользовательских хранилищ (IRepositoryFactory), котораявозьмет строку и затем передаст ее конструктору хранилища.Но этот подход работал с неуниверсальными репозиториями, и он также требовал специальных конструкторов в репозитории, которых я хотел бы избежать, если это возможно.

Это вне контроллера, поэтому я не могу использовать внедрение конструктора контроллера (У меня это работает на самом деле).Я действительно застрял с этим.

1 Ответ

0 голосов
/ 22 июня 2011

Вы должны будете использовать отражение, чтобы динамически вызывать дженерики.

Это должно работать:

var targetType = typeof(IContentRepository<>).MakeGenericType(Type.GetType(contentType));
object repository = System.Web.Mvc.DependencyResolver.Current.GetType().GetMethod("GetService").MakeGenericMethod(targetType).Invoke(System.Web.Mvc.DependencyResolver.Current, null);
...