簡體   English   中英

DependencyResolutionException檢測到循環組件依賴關系:如何使用Autofac注入裝飾器?

[英]DependencyResolutionException Circular component dependency detected: How to use Autofac to inject decorator?

我有一個名為ILastActivityUpdator的接口,如下所示:

public interface ILastActivityUpdator
{
    void UpdateLastActivity(int userId);
}

除此之外,我有兩個實現此接口的類,即LastActivityUpdator和裝飾器AnonymousUserLastActivityUpdator 后者將ICookieProvider作為額外參數,並在方法實現中使用它。 也就是說,

public LastActivityUpdator(IUnitOfWork unitOfWork) 
    : base(unitOfWork)
{ }

public void UpdateLastActivity(int userId)
{
    // Do some stuff.
}

裝飾者:

public AnonymousUserLastActivityUpdator(
    IUnitOfWork unitOfWork,
    ICookieProvider cookieProvider,
    ILastActivityUpdator lastActivityUpdator) 
    : base(unitOfWork)
{
    this.lastActivityUpdator = lastActivityUpdator;
    this.cookieProvider = cookieProvider;
}

public void UpdateLastActivity(int userId)
{
    lastActivityUpdator.UpdateLastActivity(userId);

    cookieProvider.SetCookie(); 
}

我想注入AnonymousUserLastActivityUpdatorAnonymousUserServiceLastActivityUpdatorUserService

為此, IoCConfig中的RegisterDependencies方法包含以下從Autofac FAQ Decorator部分獲取的注冊表

builder.RegisterType()。Keyey(AuthenticatedStatus.Anonymous).InstancePerRequest(); builder.RegisterType()。Keyey(AuthenticatedStatus.Authenticated).InstancePerRequest();

builder.RegisterType<LastActivityUpdator>()
    .Named<ILastActivityUpdator>("lastActivityUpdator");
builder.RegisterType<AnonymousUserLastActivityUpdator>()
    .Named<ILastActivityUpdator>("lastActivityUpdator");

// Then register the decorator. The decorator uses the
// named registrations to get the items to wrap.
builder.RegisterDecorator<ILastActivityUpdator>(
    (c, p, inner) => new AnonymousUserLastActivityUpdator(
        c.Resolve<IOogstplannerUnitOfWork>(), 
        c.Resolve<ICookieProvider>(),
        inner),
    fromKey: "lastActivityUpdator");

不幸的是,當我運行代碼時,我收到錯誤:

Autofac.Core.DependencyResolutionException檢測到循環組件依賴項:
Services.AnonymousUserService - >
Services.AnonymousUserService - >
Services.AnonymousUserLastActivityUpdator - >
Services.AnonymousUserLastActivityUpdator - >
Services.AnonymousUserLastActivityUpdator。

此外,我不明白為什么會注入正確的實現。 有誰知道如何解決這一問題?

您有此錯誤,因為C#編譯器不知道要采用哪個RegisterDecorator方法的重載。

如果你強迫它:

builder.RegisterDecorator<ILastActivityUpdator>(
    new Func<IComponentContext, ILastActivityUpdator, ILastActivityUpdator>(
        (c, inner) => new AnonymousUserLastActivityUpdator(inner)
    ),
    fromKey: "lastActivityUpdator");

您將遇到新錯誤:

AnonymousUserLastActivityUpdator不包含帶有1個參數的構造函數

此錯誤是由此行引起的:

new AnonymousUserLastActivityUpdator(inner)

要解決此錯誤,您必須更改創建AnonymousUserLastActivityUpdator實例的方式

例如 :

// only the type being decorated should be registered here
builder.RegisterType<LastActivityUpdator>()
       .Named<ILastActivityUpdator>("lastActivityUpdator");

builder.RegisterDecorator<ILastActivityUpdator>(
    (c, inner) => new AnonymousUserLastActivityUpdator(c.Resolve<IUnitOfWork>(), 
                                                       c.Resolve<ICookieProvider>(), 
                                                       inner),
    fromKey: "lastActivityUpdator")
       .As<ILastActivityUpdator>(); 

甚至更好:

builder.RegisterType<LastActivityUpdator>()
       .Named<ILastActivityUpdator>("lastActivityUpdator");
builder.RegisterType<AnonymousUserLastActivityUpdator>()
       .Named<ILastActivityUpdator>("anonymousLastActivityUpdator");

builder.RegisterDecorator<ILastActivityUpdator>(
    (c, inner) => c.ResolveNamed<ILastActivyUpdator>("anonymousLastActivityUpdator", 
                                                     TypedParameter.From(inner)),
    fromKey: "lastActivityUpdator")
       .As<ILastActivityUpdator>(); 

暫無
暫無

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

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