簡體   English   中英

Autofac-組件會忽略生命周期范圍內定義的依賴項

[英]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.

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