#asp.net-mvc-3 #unity-container #autofac
#asp.net-mvc-3 #unity-контейнер #autofac
Вопрос:
Я пытаюсь создать шаблон общего репозитория, в котором я могу использовать технологии ORM, но я наткнулся на эту проблему при попытке подключиться к контейнеру IOC
public interface IRepository<T>
{
//members
}
Для NHbernate это работает нормально
public class FNHRepository<T>: IRepository<T>
{ //members }
Но для сущности я вынужден добавить предложение where
public class EFRepository<T> : IRepository<T> where T : class
{
если я опускаю «предложение where», я не могу этого сделать
dbset = DataContext.Set<T>() ;
указание только ссылочного типа может использоваться как T
Проблема возникает, когда я пытаюсь подключить IRepository к IOC, например
.RegisterType(typeof(IRepository<>), typeof(EFRepository<>));
Я не могу подключить интерфейс, если реализующий класс имеет where T : class , я получаю следующее выполнение
исключение: InvalidOperationException — текущий тип, System.Web.Mvc.IControllerFactory, является интерфейсом и не может быть сконструирован. Вам не хватает сопоставления типов?
Я попробовал это с помощью Unity и Autofac и получил ту же ошибку
Комментарии:
1. попробуйте добавить такое же ограничение в свой интерфейс.
2. изначально я начинал так, но когда я добавляю ‘where T: class’, ioc выдает ошибку при подключении
3. InvalidOperationException — текущий тип System.Web.Mvc.IControllerFactory является интерфейсом и не может быть сконструирован. Вам не хватает сопоставления типов
4. Показать внутреннее исключение, которое показывает фактические детали
5. [Система. InvalidOperationException] = {«Текущий тип, System.Web.Mvc.IControllerFactory, является интерфейсом и не может быть сконструирован. Вам не хватает сопоставления типов? «}
Ответ №1:
Не уверен в Unity, но вы должны иметь возможность зарегистрировать универсальный класс с ограничениями просто отлично.
builder.RegisterGeneric(typeof(EFRepo...))
.AsImplementedInterfaces();
Однако проблема заключается в следующем: без того же ограничения на интерфейс это неизбежно приведет к сбою:
container.Resolve<IRepo<int>>();
Комментарии:
1. я добавил Builder. RegisterAssemblyTypes() . AsImplementedInterfaces(); все еще получая ошибку, я думал, что ошибка исчезла, но все еще существует