首页 > 解决方案 > 首次调用 GetInstance、GetAllInstances、Verify 和部分 GetRegistration 调用后,容器无法更改

问题描述

我无法弄清楚为什么我在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>())
});

标签: c#dependency-injectionsimple-injector

解决方案


您收到此错误是因为您GetInstance在容器设置期间调用。正如例外情况和参考文档所解释的那样,这是不允许的。

问题是由于您尝试部分手动连接您的注册,而您应该更喜欢让 Simple Injector 为您完成繁重的工作并自动连接所有内容。因此,您应该将您的注册更改为以下内容:

container.Register<IEmailTemplatesService, EmailTemplatesService>();

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

推荐阅读