1

Я внимательно следил за очень полезным ответом here, чтобы организовать мою единицу работы и хранилища динамически с помощью SimpleInjector DI.Зарегистрировать общие типы в SimpleInjector Version 3

Используя сервис тест ниже:

public class TestService 
{ 
    public TestService(IRepository<Call> calls){}  
} 

В контроллере:

public class TestingController : Controller 
{ 

    private readonly IUnitOfWork _unitOfWork ; 

    public TestingController(IUnitOfWork unitOfWork, TestService testService) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

И загрузчик:

public static class BootStrapper 
{ 
    public static void ConfigureWeb(Container container) 
    { 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 
        container.Options.ConstructorResolutionBehavior = new GreediestConstructorBehavior(); 


     container.Register<DbContext, OCISContext>(Lifestyle.Scoped); 
     container.Register<ApplicationUserManager>(Lifestyle.Scoped); 
     container.Register<ApplicationSignInManager>(Lifestyle.Scoped); 
     container.Register<IAuthenticationManager>(() => 
      AdvancedExtensions.IsVerifying(container) 
       ? new OwinContext(new Dictionary<string, object>()).Authentication 
       : HttpContext.Current.GetOwinContext().Authentication, Lifestyle.Scoped); 

     container.Register<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(Lifestyle.Scoped); 

     container.Register<IUnitOfWork, UnitOfWork.UnitOfWork>(Lifestyle.Scoped); 
     container.RegisterCollection(typeof(IRepository<>), typeof(IRepository<>).Assembly); 
     container.Register<TestService>(Lifestyle.Scoped); 
    } 

Я получаю ошибку:

An exception of type 'System.InvalidOperationException' occurred in SimpleInjector.dll but was not handled in user code

Additional information: The configuration is invalid. Creating the instance for type TestService failed. The constructor of type TestService contains the parameter with name 'calls' and type IRepository<Call> that is not registered. Please ensure IRepository<Call> is registered, or change the constructor of TestService. There is, however, a registration for IEnumerable<IRepository<Call>> ; Did you mean to depend on IEnumerable<IRepository<Call>> ?

Я также попытался

container.RegisterCollection<IRepository>(new [] {typeof(IRepository)}); 
container.RegisterCollection(typeof(IRepository), new[] {typeof(IRepository)}); 

Мое намерение состоит в том, чтобы получить экземпляр GenericRepository как это implents IRepository, как показано в ответ на ссылку выше.

+0

Обновите свой код и добавьте соответствующий код, который показывает, почему вы регистрируете репозитории в UnitOfWork. – Steven

ответ

2

Сообщение об исключении вы получаете на самом деле довольно ясно (или, по крайней мере, для меня):

Please ensure IRepository<Call> is registered, or change the constructor of TestService. There is, however, a registration for IEnumerable<IRepository<Call>> ; Did you mean to depend on IEnumerable<IRepository<Call>> ?

Другими словами, вы сделали после регистрации:

container.RegisterCollection(typeof(IRepository<>), typeof(IRepository<>).Assembly); 

RegisterCollection означает, что регистрация могут быть решены как коллекция. Ваш TestService однако зависит от IRepository<Call> вместо IEnumerable<IRepository<Call>>.

Поскольку я думаю, что маловероятно, что ваше приложение будет использовать несколько реализаций для IRepository<Call> одновременно, регистрация коллекций, вероятно, не является тем, что вы хотите; существует вероятное сопоставление «один к одному» между закрытой версией общего интерфейса IRepository<T> и реализацией.

Так вместо этого, сделать регистрацию следующим образом:

container.Register(typeof(IRepository<>), new[] { typeof(IRepository<>).Assembly }); 

Это обеспечивает отображение на один-к-одному и выбросит исключение в случае случайно больше реализаций одного и того же закрытого общего типа.

+0

Большое спасибо! он, похоже, сработал, хотя есть идея, почему один и тот же репозиторий создается несколько раз, поэтому он пытается зарегистрироваться в UOW второй раз, но не работает, поскольку ключ уже присутствует в 'private readonly Dictionary _repositories ; '? – Ian

+0

Все хорошо, я добавил 'container.Register (Lifestyle.Scoped)' в какой-то момент, но это был оскорбительный код. Все отлично работает сейчас, очень спасибо Стивену. – Ian

Смежные вопросы