Контейнер невозможно изменить после первого вызова GetInstance, GetAllInstances, Verify и некоторых вызовов GetRegistration - PullRequest
0 голосов
/ 04 мая 2018

Я не могу понять, почему я получаю эту ошибку ниже в методе RegisterCollection. Я неправильно настраиваюсь?

Контейнер невозможно изменить после первого вызова GetInstance, GetAllInstances, Verify и некоторых вызовов GetRegistration. Пожалуйста, посмотрите https://simpleinjector.org/locked, чтобы понять, почему контейнер заблокирован. Следующая трассировка стека описывает местоположение, в котором был заблокирован контейнер:

Регистрация регистратора

 public static void Register(Container container)
 {
     container.RegisterConditional(typeof(ILogger), 
        c => typeof(NLogLogger<>).MakeGenericType(
            c.Consumer?.ImplementationType ?? typeof(object)),
        Lifestyle.Transient, 
        c => true);

...

}

container.RegisterCollection выдает ошибку

container.Register<IEmailTemplatesService>(() => new EmailTemplatesService(emailTemplates,
    container.GetInstance<IEventEmailTemplatesRepository>(),
    container.GetInstance<IEmailTemplatesRepository>(),
    container.GetInstance<IEventSettingsRepository>(),
    container.GetInstance<IEmailsService>(),
    container.GetInstance<IUnitOfWork>(),
    container.GetInstance<IValidationProvider>()));

container.RegisterCollection<IStreamingMethod>(new List<IStreamingMethod>
{
    new CubeProvider(container.GetInstance<ILogger>()),
    new BallerTvProvider(container.GetInstance<ILogger>())
});

1 Ответ

0 голосов
/ 04 мая 2018

Вы получаете эту ошибку, потому что вы звоните GetInstance во время настройки вашего контейнера. Как объясняют исключение и ссылочная документация, это не разрешено.

Проблема вызвана тем, что вы пытаетесь частично вручную зарегистрировать свою регистрацию, в то время как вы должны предпочесть, чтобы Simple Injector сделал всю тяжелую работу, а Auto-Wire - все за вас. Поэтому вы должны изменить свою регистрацию на следующее:

container.Register<IEmailTemplatesService, EmailTemplatesService>();

container.RegisterCollection<IStreamingMethod>(new[]
{
    typeof(CubeProvider),
    typeof(BallerTvProvider)
});
...