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
和一个decorator
AnonymousUserlastActivityUpdater
。后者将
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>();