[英]Autofac - Components ignore dependency defined in lifetime scope
我很可能在這里誤會了一些東西,所以也許這里有一個簡單的答案,但是我目前正在撓頭。
我有一個實現IUnitOfWork的UnitOfWork類(是的,我知道)。 工作單元的構造函數采用IPrincipalFactory。 TResponder是采用IUnitOfWork的圖表的頂層。
我正在嘗試將ApplicationPrincipalFactory注冊為生命周期范圍內的特定實例...它取決於傳遞給HandleAsync函數的某些屬性。 我正在執行以下操作:
public async Task<TResponse> HandleAsync<TMessage, TResponse, TResponder>(TMessage message)
where TMessage : class
where TResponder : IRespondAsync<TMessage, TResponse>
{
using (var scope = this.BeginLifetimeScope(message))
{
var responder = scope.Resolve<TResponder>();
return await responder.Respond(message);
}
}
private ILifetimeScope BeginLifetimeScope<TMessage>(TMessage message)
{
var unwrapped = GetDomainContext(message);
var applicationPrincipalFactory = this.CreateApplicationPrincipalFactory(unwrapped);
var lifetime = this.container.BeginLifetimeScope(
r => r.RegisterInstance(applicationPrincipalFactory).As<IPrincipalFactory>());
return lifetime;
}
private ApplicationPrincipalFactory CreateApplicationPrincipalFactory(IDomainContext unwrapped)
{
var applicationPrincipalFactory =
new ApplicationPrincipalFactory(
unwrapped.Tenant,
unwrapped.ActingTenant,
unwrapped.Username);
return applicationPrincipalFactory;
}
根據我已閱讀的所有內容,在BeginLifetimeScope(r =>內定義依賴項應覆蓋父容器綁定,因此,當我調用resolve時,它應該都整齊地排列在一起。
但是,我得到一個例外:
None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'Platform.Engine.Persistence.UnitOfWork' can be invoked with the available services and parameters: Cannot resolve parameter 'Platform.Engine.Security.IPrincipalFactory principalFactory' of constructor
除了使用此方法,我沒有在其他任何地方注冊IPrincipalFactory。 IUnitOfWork在外部范圍中定義如下:
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerLifetimeScope();
我還嘗試過在子容器中重新定義工作單元注冊,以防出現問題,方法是在外部容器中而不是在整個生命周期中進行注冊:
var lifetime = this.container.BeginLifetimeScope(
r => r.RegisterInstance(applicationPrincipalFactory).As<IPrincipalFactory>());
var overrides = new ContainerBuilder();
overrides.RegisterType<UnitOfWork>().As<IUnitOfWork>();
overrides.Update(lifetime.ComponentRegistry);
return lifetime;
我不確定我缺少什么...任何想法或建議?
在初始容器配置期間,使用其余類型注冊您的工廠。
builder.RegisterType<ApplicationPrincipalFactory>().As<IPrincipalFactory>();
然后在您的生命周期范圍內,解析一個可以將上下文傳遞到的委托工廠。
var factory = container.Resolve<Func<IDomainContext, IPrincipalFactory>>();
var instance = factory(context);
您也可以在Func<>
簽名中添加三個string
參數,但是由於您已經有了一個不錯的上下文對象,因此我將其傳遞給了它。
最后,根據需要使用工廠。
instance.DoesSomethingButNotSureWhat();
這將防止您僅通過傳遞context參數就可以更新生存期范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.