[英]DryIoc - ASP.Net Core - Scope context per request
我想在我的應用程序(ASP.Net Core 2.2)中使用DryIoc。 我想在執行一個API服務的調用期間使用相同的服務實例。 (在Http調用期間/作用域上下文中)。 如果它位於ASP.Net WebApi中,則我希望每個http上下文都有一個作用域。 在DryIoc文檔中,可以將AsyncExecutionFlowScopeContext用於WebApi。
但是,對於ASP.Net Core,我並不真正了解如何使用和聲明每個請求的作用域。
我的代碼基於以下示例: https : //github.com/dadhi/DryIoc/tree/master/samples/DryIoc.AspNetCore.Sample
如果我嘗試解析聲明為ScopeService(Reuse.Scoped)的服務,則會出現問題:無法從沒有范圍的容器解析IScopedService IsResolutionCall。
供您參考,我的容器的聲明類似於示例:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc()
// Enables controllers to be resolved by DryIoc, OTHERWISE resolved by infrastructure
.AddControllersAsServices();
var container = new Container(rules => rules.With(
propertiesAndFields: request =>
request.ServiceType.Name.EndsWith("Controller")
? PropertiesAndFields.Properties()(request)
: null)
.WithCaptureContainerDisposeStackTrace());
Container = container;
return container.WithDependencyInjectionAdapter(services,
throwIfUnresolved: type => type.Name.EndsWith("Controller"))
// Your registrations are defined in CompositionRoot class
.ConfigureServiceProvider<CompositionRoot>();
}
對於注冊:
public CompositionRoot(IRegistrator r)
{
r.Register<ISingletonService, SingletonService>(Reuse.Singleton);
r.Register<ITransientService, TransientService>(Reuse.Transient);
r.Register<IScopedService, ScopedService>(Reuse.Scoped);
}
如果我嘗試在一項服務中執行此操作:
var myScopedServvie = Container.Resolve<IScopedService>();
我有一個例外:ContainerException:無法通過帶有{CaptureContainerDisposeStackTrace}和Made = {PropertiesAndFields =}的規則的無范圍容器從容器解析IScopedService IsResolutionCall
所以我的問題是:如何為我的API的每個請求打開作用域? 我可以看到一些測試:
(var scope = container.OpenScope())
...
但是我不知道如何在我的應用程序中使用此代碼。
謝謝你的幫助。
Asp .Net Core框架會根據每個Web請求自動打開一個范圍,您無需費心。
如果要測試容器設置,則可以在相應的測試中手動使用OpenScope
,然后從返回的范圍中進行解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.