Простая область инжектора с DbContext - PullRequest
0 голосов
/ 05 марта 2019

Я использую простой инжектор.

У меня есть проект MVC, который также имеет ApiControllers.

Вот мои настройки:

 public static class SimpleInjectorWebApiInitializer
{
    /// <summary>Initialize the container and register it as Web API Dependency Resolver.</summary>
    public static void Initialize()
    {
        var container = new Container();
        container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

        InitializeContainer(container);

        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
        // This is an extension method from the integration package.
        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
       // GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
    }

    private static void InitializeContainer(Container container)
    {
        container.Register<DbContext, CoreContext>(Lifestyle.Scoped);
        container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
    }
}

Однако это дает мне ошибку:

Недопустимая конфигурация.Сообщалось о следующих диагностических предупреждениях: - [Несоответствие образа жизни] UnitOfWork (Async Scoped) зависит от CoreContext (Transient).

1 Ответ

0 голосов
/ 05 марта 2019

Ваш класс UnitOfWork зависит от CoreContext, но вы не зарегистрировали CoreContext как службу, а только как реализацию.Simple Injector будет искать только регистрацию услуг, но регистрация для CoreContext отсутствует.Как запасной вариант, Simple Injector попытается разрешить CoreContext напрямую, что работает, потому что это конкретный тип.Однако эти незарегистрированные конкретные типы по умолчанию разрешаются с использованием образа жизни Transient.

Разрешение реализации DbContext в качестве Transient, однако, обычно не то, что вам нужно.Scoped обычно лучше, и поэтому Simple Injector правильно предупреждает об этом.

Вам следует изменить свою регистрацию на следующее:

container.Register<CoreContext>(Lifestyle.Scoped);
container.Register<IUnitOfWork, UnitOfWork>(Lifestyle.Scoped);
...