簡體   English   中英

將Simple Injector與可選的ASP.NET Core Web API集成

[英]Integrate Simple Injector with optional ASP.NET Core Web API

我遵循了本指南https://simpleinjector.org/aspnetcore來啟動並運行基本應用程序。 而且效果很好。

但是,我現在的需求有所不同。 我的應用程序中的Web API基本上是一個可選端點,可能無法啟動。 我想在整個應用程序中使用簡單注入器進行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();

並且在StartUp內部是我鏈接的相同代碼。

我的問題是,SimpleInjector容器被保存(和設置)在StartUp中,而我卻無從得知。 我真正想要的是執行StartUp例程並與aspnet核心集成之前 ,設置所有與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的純Web Api。 它是一個遺留應用程序,其中包含許多后台線程來完成單獨的工作,而並非所有這些線程都應以某種方式在網絡api中公開。 在某些環境中,甚至不應該啟動Web API。 您可能會爭辯說應該以某種方式拆分應用程序,但是鑒於我的約束,這根本不是一個選擇。

簡而言之:它解決了我希望在整個應用程序中使用相同的DI容器,依賴相同的服務,持久性訪問等的目標,而我的REST資源能夠利用部分遺留應用程序功能。

這可能嗎,我該怎么做? 還是我以“錯誤的方式”使用這些工具?

對於任何有興趣的人。 我做了史蒂文建議的解決方案。 非常感謝你。

基本上,該應用程序變為:

            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 StartUp類型中創建另一個容器實例,並將其設置為:

    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);
    }

這按我預期的那樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM