![](/img/trans.png)
[英]How to register a decorator with Autofac: "Circular component dependency detected"
[英]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();
}
我想注入AnonymousUserLastActivityUpdator
在AnonymousUserService
和LastActivityUpdator
在UserService
。
為此, 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.