Интеграция Simple Injector с дополнительным веб-API ASP.NET Core - PullRequest
0 голосов
/ 08 ноября 2018

Я следовал этому руководству https://simpleinjector.org/aspnetcore для настройки и запуска базового приложения. И это прекрасно работает.

Однако мои потребности сейчас немного другие. Веб-API в моем приложении - это необязательная конечная точка, которая может не запускаться. Однако я хочу использовать Simple Injector for DI во всем приложении.

В моем Program.cs есть следующие строки:

// REST API
if (Config.ReadSettingBool("StartRestEndpoint", false))
{
    LogManager.Info("Starting REST Endpoint...");
    try
    {
        _httpHost = new HttpHost(
            Config.ReadSetting("HttpHost", "localhost"),
            Config.ReadSetting("HttpPort", 8081),
            Config.ReadSetting("RestEnvironment", "Development"));
        _httpHost.Start();
        LogManager.Info("REST Endpoint started");
    }
    catch (Exception e)
    {
        LogManager.Error($"Failed to start REST endpoint: {e}");
    }
}

Теперь внутри HttpHost это происходит:

_webHost = WebHost.CreateDefaultBuilder()
    .UseUrls()
    .UseUrls(_url)
    .UseStartup<Startup>()
    .UseEnvironment(_environment)
    .Build();
_webHost.Start();

и внутри автозапуска тот же код, который я связал.

Моя проблема в том, что контейнер SimpleInjector хранится (и настраивается) внутри автозагрузки, и у меня нет способа добраться до него. Что я действительно хочу, так это настроить все дерево зависимостей, не связанных с aspnet до , для выполнения процедуры StartUp и интеграции с ядром aspnet.

То есть часть "добавить службы приложений" в приведенной ниже выдержке:

private void InitializeContainer(IApplicationBuilder app) {
    // Add application presentation components:
    container.RegisterMvcControllers(app);
    container.RegisterMvcViewComponents(app);

    // Add application services. For instance:
    container.Register<IUserService, UserService>(Lifestyle.Scoped);

    // Allow Simple Injector to resolve services from ASP.NET Core.
    container.AutoCrossWireAspNetComponents(app);
}

Причина, по которой вы этого хотите, заключается в том, что это приложение не является чистым веб-интерфейсом, сконцентрированным вокруг Http. Это унаследованное приложение, содержащее множество фоновых потоков, выполняющих отдельную работу, не все из которых должны каким-либо образом отображаться в веб-API. В некоторых средах веб-API даже не должен запускаться. Вы можете утверждать, что приложение должно быть как-то разделено, но, учитывая мои ограничения, это просто не вариант.

Вкратце: это решает мою цель: использовать один и тот же DI-контейнер, полагаясь на одни и те же сервисы, постоянный доступ и многое другое во всем приложении, поскольку мои ресурсы REST могут использовать части функциональности унаследованного приложения.

Возможно ли это, и как я могу это сделать? Или я использую эти инструменты "неправильный путь"?

1 Ответ

0 голосов
/ 08 ноября 2018

Для всех, кто заинтересован.Я сделал решение, предложенное Стивеном.Большое спасибо.

В основном приложение становится:

            LogManager.Info("Starting REST Endpoint...");
            try
            {
                _httpHost = new HttpHost(
                    Config.ReadSetting("HttpHost", "localhost"),
                    Config.ReadSetting("HttpPort", 8081),
                    Config.ReadSetting("RestEnvironment", "Development"));
                _httpHost.Start();
                LogManager.Info("REST Endpoint started");
            }
            catch (Exception e)
            {
                LogManager.Error($"Failed to start REST endpoint: {e}");
            }


            LogManager.Info("Starting Monitors...");
            // Set up dependency tree.
            Container _container = new Container();
            BootstrapDependencyInjectionTree.Bootstrap(_container);
            _container.Verify();

            _monitors = new Monitors(_container.GetInstance<IMonitorDefinitionRepository>());
            _monitors.RegisterMonitors();
            _monitors.StartContinuousMonitors();

, при этом другой экземпляр контейнера создается внутри типа запуска aspnetcore и настраивается как:

    private void InitializeContainer(IApplicationBuilder app)
    {
        // Add application presentation components:
        _container.RegisterMvcControllers(app);
        _container.RegisterMvcViewComponents(app);

        // Add application services.
        // This creates an object dependency graph that is used to populate all constructor arguments using DI.
        BootstrapDependencyInjectionTree.Bootstrap(_container);

        // Web api only dependencies.
        _container.RegisterSingleton<IMonitorMetaDataProvider, MonitorMetaDataProvider>();

        // Allow Simple Injector to resolve services from ASP.NET Core.
        _container.AutoCrossWireAspNetComponents(app);
    }

Это работает так, как я ожидал.

...