C# 检测到依赖项ResolutionException循环组件依赖项:如何使用Autofac注入装饰器?
我有一个名为C# 检测到依赖项ResolutionException循环组件依赖项:如何使用Autofac注入装饰器?,c#,dependency-injection,mono,decorator,autofac,C#,Dependency Injection,Mono,Decorator,Autofac,我有一个名为ILASTativityUpdater的接口,如下所示: public interface ILastActivityUpdator { void UpdateLastActivity(int userId); } 除此之外,我还有两个类实现这个接口,分别是lastActivityUpdater和一个decoratorAnonymousUserlastActivityUpdater。后者将ICookieProvider作为额外参数,并在方法实现中使用它。即 public L
ILASTativityUpdater
的接口,如下所示:
public interface ILastActivityUpdator
{
void UpdateLastActivity(int userId);
}
除此之外,我还有两个类实现这个接口,分别是lastActivityUpdater
和一个decoratorAnonymousUserlastActivityUpdater
。后者将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();
}
我想在匿名用户服务
中插入匿名用户LastActivityUpdater
,在用户服务
中插入LastActivityUpdater
为此,IoCConfig中的RegisterDependencies方法包含以下取自的注册表项
builder.RegisterType()
.Keyed(AuthenticatedStatus.Anonymous)
.InstancePerRequest();
builder.RegisterType()
.Keyed(AuthenticatedStatus.Authenticated)
.InstancePerRequest()
builder.RegisterType()
.命名为(“LastActivityUpdater”);
builder.RegisterType()
.命名为(“LastActivityUpdater”);
//然后注册装饰师。装潢师使用
//命名注册以获取要包装的项目。
builder.RegisterDecorator(
(c,p,内部)=>新的匿名UserLastActivityUpdater(
c、 Resolve(),
c、 Resolve(),
内部),
fromKey:“LastActivityUpdater”);
不幸的是,当我运行代码时,我得到了错误:
Autofac.Core.dependencResolutionException
检测到循环组件依赖关系:Services.AnonymousUserService->
Services.AnonymousUserService->
Services.AnonymousUserLastActivityUpdater->
Services.AnonymousUserLastActivityUpdater->
Services.AnonymousUserLastActivityUpdater
此外,我不明白为什么会神奇地注入正确的实现。有人知道如何修复此问题吗?您有此错误,因为C编译器不知道要采用
RegisterDecorator
方法的哪个重载
如果你强迫它:
builder.RegisterDecorator<ILastActivityUpdator>(
new Func<IComponentContext, ILastActivityUpdator, ILastActivityUpdator>(
(c, inner) => new AnonymousUserLastActivityUpdator(inner)
),
fromKey: "lastActivityUpdator");
要解决此错误,您必须更改创建匿名UserLastActivityUpdater实例的方式
例如:
// 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()
.命名为(“LastActivityUpdater”);
builder.RegisterDecorator(
(c,内部)=>新的匿名UserLastActivityUpdater(c.Resolve(),
c、 Resolve(),
内部),
fromKey:“LastActivityUpdater”)
.As();
或者更好:
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>();
builder.RegisterType()
.命名为(“LastActivityUpdater”);
builder.RegisterType()
.命名为(“匿名LastActivityUpdater”);
builder.RegisterDecorator(
(c,内部)=>c.ResolveNamed(“匿名LastActivityUpdater”,
类型参数从(内部)开始,
fromKey:“LastActivityUpdater”)
.As();
代码可以编译,但当我运行它时,我得到错误:Autofac.Core.dependencResolutionException检测到循环组件依赖:Services.AnonymousUserService->Services.AnonymousUserService->Services.anonymousUserLastActivityUpdater->Services.anonymousUserLastActivityUpdater->Services.AnonymousUserLastActivityUpdater.-代码>啊,糟糕,Autofac被搞糊涂了,因为我之前在扫描服务程序集时注册了它们。代码有效!谢谢。
// 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>();