我有两个类使用ILastActivityUpdator作为构造函数参数:UserServiceAnonymousUserService

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把LastActivityUpdatorAnonymousUserService连接起来,把AnonymousUserLastActivityUpdatorUserService连接起来。
我试图为decorator添加一个接口,该接口是从基本接口派生的,如下所示:
public interface IAnonymousUserLastActivityUpdator : ILastActivityUpdator
{ }

然后我想我可以在LastActivityUpdator构造函数中使用IAnonymousUserLastActivityUpdator,所有的东西都将正确地自动连接。
不幸的是,它总是使用第一个实现,因为它是较早注册的(按字母顺序)。
如何才能实现AnonymousUserService注入IAnonymousUserLastActivityUpdatorAnonymousUserService注入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>());

然后,当您从容器解析UserServiceAnonymousUserService时,它们将获得正确的依赖项。
另外,如果一个接口被注入到一个类中,那么该类应该在该接口的所有实现中正常工作(LSP)。从类名来看,似乎AnonymousUserService只适用于AnonymousUserLastActivityUpdator,而不适用于ILastActivityUpdator的任何实现。如果是这样的话,那么可以按照您的建议引入不同的抽象(比如IAnonymousUserLastActivityUpdator)。

07-24 09:55