![](/img/trans.png)
[英]Resolve dependencies in ASP.NET Web API with Simple Injector and IHttpControllerActivator
[英]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.