Подключение общего репозитория к контейнеру IOC

#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(); все еще получая ошибку, я думал, что ошибка исчезла, но все еще существует