【发布时间】:2015-09-04 18:06:52
【问题描述】:
我有一个IoCConfig,其中首先在 RegisterDependencies 方法中注册所有Services(与ServiceBase 相同的程序集),除了一个服务和一个名为LastActivityUpdator 的类和一个名为@987654328 的类的装饰器@ 两者都实现了ILastActivityUpdator。
我想要完成的目标是正确注册装饰器,这已经在this answer 之后工作。我还要求一种方法让一个班级(UserService)使用LastActivityUpdator,而另一个(AnonymousUserService)使用AnonymousUserLastActivityUpdator,得到了here的回答。为了完整起见(我认为这与这个问题无关),我使用this answer 之后的键控服务来决定在其他时间注入哪个类。
不幸的是,当我结合这些想法时,我总是看到注入了 AnonymousUserLastActivityUpdator,同样在 UserService 的情况下,我希望提供 LastActivityUpdator。
在您下方找到IocConfig,它使用了注册装饰器的想法并为特定类提供了一种类型:
builder.RegisterAssemblyTypes(typeof(ServiceBase).Assembly)
.Except<AnonymousUserService>()
.Except<LastActivityUpdator>()
.Except<AnonymousUserLastActivityUpdator>()
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterType<LastActivityUpdator>()
.Named<ILastActivityUpdator>("lastActivityUpdator");
builder.RegisterType<AnonymousUserLastActivityUpdator>()
.Named<ILastActivityUpdator>("anonymousUserLastActivityUpdator");
builder.RegisterDecorator<ILastActivityUpdator>(
(c, inner) => c.ResolveNamed<ILastActivityUpdator>("anonymousUserLastActivityUpdator",
TypedParameter.From(inner)),
fromKey: "lastActivityUpdator")
.As<ILastActivityUpdator>();
builder.Register(c => new UserService(
c.Resolve<OogstplannerUnitOfWork>(),
c.Resolve<CookieProvider>(),
c.Resolve<ILastActivityUpdator>()));
builder.Register(c => new AnonymousUserService(
c.Resolve<OogstplannerUnitOfWork>(),
c.Resolve<CookieProvider>(),
c.Resolve<AnonymousUserLastActivityUpdator>()));
builder.RegisterType<AnonymousUserService>()
.Keyed<IUserService>(AuthenticatedStatus.Anonymous)
.InstancePerRequest();
builder.RegisterType<UserService>()
.Keyed<IUserService>(AuthenticatedStatus.Authenticated)
.InstancePerRequest();
不幸的是,这不起作用。 AnonymousUserService 和UserService 都获得了LastActivityUpdator 的实例,而我希望AnonymousUserService 获得AnonymousUserService 的实例。
有谁知道为什么我的 RegisterDependencies 方法没有提供 LastActivityUpdator 到 UserService 以及我该如何实现这一点?
/编辑
使用 Cyril 的答案和一些调整,注册适用于 UserService,但是一旦用户注销并使用 AnonymousUserService,我就会收到错误:
检测到循环组件依赖:
Services.AnonymousUserService ->
Services.AnonymousUserService ->
Services.AnonymousUserLastActivityUpdator ->
Services.AnonymousUserLastActivityUpdator -> System.Object ->
Services。 AnonymousUserLastActivityUpdator
我根据 Cyril 的回答对代码进行了一些调整(修正了一些错别字并切换了匿名用户服务和普通用户服务),我可能犯了一个错误,这里是:
builder.RegisterAssemblyTypes(typeof(ServiceBase).Assembly)
.Except<AnonymousUserService>()
.Except<LastActivityUpdator>()
.Except<AnonymousUserLastActivityUpdator>()
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterType<LastActivityUpdator>()
.Named<ILastActivityUpdator>("lastActivityUpdator");
builder.RegisterType<AnonymousUserLastActivityUpdator>()
.Named<ILastActivityUpdator>("anonymousUserLastActivityUpdator");
builder.RegisterDecorator<ILastActivityUpdator>(
(c, inner) => c.ResolveNamed<ILastActivityUpdator>("anonymousUserLastActivityUpdator",
TypedParameter.From(inner)),
fromKey: "lastActivityUpdator")
.As<ILastActivityUpdator>();
builder.RegisterType<UserService>()
.Keyed<IUserService>(AuthenticatedStatus.Authenticated)
.WithParameter(
(p, c) => p.Name == "lastActivityUpdator",
(p, c) => c.ResolveNamed<ILastActivityUpdator>("lastActivityUpdator"))
.InstancePerRequest();
builder.RegisterType<AnonymousUserService>()
.Keyed<IUserService>(AuthenticatedStatus.Anonymous)
.WithParameter(
(p, c) => p.Name == "anonymousUserLastActivityUpdator",
(p, c) => c.ResolveNamed<ILastActivityUpdator>("anonymousUserLastActivityUpdator"))
.InstancePerRequest();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
【问题讨论】:
标签: c# dependency-injection decorator autofac