我有两个类使用ILastActivityUpdator
作为构造函数参数:UserService
和AnonymousUserService
。
public AnonymousUserService(ILastActivityUpdator lastActivityUpdator)
{
if (lastActivityUpdator == null)
{
throw new ArgumentNullException("lastActivityUpdator");
}
this.lastActivityUpdator = lastActivityUpdator;
}
与上述类似:
public UserService(ILastActivityUpdator lastActivityUpdator)
{
if (lastActivityUpdator == null)
{
throw new ArgumentNullException("lastActivityUpdator");
}
this.lastActivityUpdator = lastActivityUpdator;
}
UserService
接口有一个方法:ILastActivityUpdator
。接口有两个实现,一个UpdateLastActivity(int userId)
和一个名为LastActivityUpdator
的decorator,它继承了AnonymousUserLastActivityUpdator
并向方法添加了一些额外的功能,如下所示:public class AnonymousUserLastActivityUpdator
: LastActivityUpdator, IAnonymousUserLastActivityUpdator
{
public AnonymousUserLastActivityUpdator()
{ }
public override void UpdateLastActivity(int userId)
{
base.UpdateLastActivity(userId);
// Extra functionality
}
}
我现在想用autofac把
LastActivityUpdator
和AnonymousUserService
连接起来,把AnonymousUserLastActivityUpdator
和UserService
连接起来。我试图为decorator添加一个接口,该接口是从基本接口派生的,如下所示:
public interface IAnonymousUserLastActivityUpdator : ILastActivityUpdator
{ }
然后我想我可以在
LastActivityUpdator
构造函数中使用IAnonymousUserLastActivityUpdator
,所有的东西都将正确地自动连接。不幸的是,它总是使用第一个实现,因为它是较早注册的(按字母顺序)。
如何才能实现
AnonymousUserService
注入IAnonymousUserLastActivityUpdator
和AnonymousUserService
注入AnonymousUserLastActivityUpdator
? 最佳答案
autofac是nicely documented的,看起来您可以找到here之后的内容。据我所知,如果你在
builder.RegisterType<LastActivityUpdator>();
builder.RegisterType<AnonymousUserLastActivityUpdator>();
那么你应该可以注册你的服务
builder.Register(c => new UserService(c.Resolve<LastActivityUpdator>()));
builder.Register(c => new AnonymousUserService(c.Resolve<AnonymousUserLastActivityUpdator>()));
或
builder.RegisterType<UserService>().WithParameter(
(p, c) => p.ParameterType == typeof(ILastActivityUpdator),
(p, c) => c.Resolve<LastActivityUpdator>());
builder.RegisterType<AnonymousUserService>().WithParameter(
(p, c) => p.ParameterType == typeof(ILastActivityUpdator),
(p, c) => c.Resolve<AnonymousUserLastActivityUpdator>());
然后,当您从容器解析
UserService
或AnonymousUserService
时,它们将获得正确的依赖项。另外,如果一个接口被注入到一个类中,那么该类应该在该接口的所有实现中正常工作(LSP)。从类名来看,似乎
AnonymousUserService
只适用于AnonymousUserLastActivityUpdator
,而不适用于ILastActivityUpdator
的任何实现。如果是这样的话,那么可以按照您的建议引入不同的抽象(比如IAnonymousUserLastActivityUpdator
)。