C# 如何使用Autofac在构造函数中注入特定的实现

C# 如何使用Autofac在构造函数中注入特定的实现,c#,asp.net-mvc,dependency-injection,autofac,C#,Asp.net Mvc,Dependency Injection,Autofac,我有两个类将ILASTativityUpdater作为构造函数参数:UserService和AnonymousUserService public AnonymousUserService(ILastActivityUpdator lastActivityUpdator) { if (lastActivityUpdator == null) { throw new ArgumentNullException("lastActivityUpdator");

我有两个类将
ILASTativityUpdater
作为构造函数参数:
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;
}
ILASTativityUpdater
接口有一个方法:
UpdateLastractivity(int-userId)
。该接口有两种实现,一种是
LastActivityUpdater
,另一种是名为
AnonymousUserLastActivityUpdater
的装饰器,它继承了
LastActivityUpdater
,并向该方法添加了一些额外的功能,如下所示:

public class AnonymousUserLastActivityUpdator 
    : LastActivityUpdator, IAnonymousUserLastActivityUpdator
{
    public AnonymousUserLastActivityUpdator()
    { }

    public override void UpdateLastActivity(int userId)
    {
        base.UpdateLastActivity(userId);

        // Extra functionality
    }
}
现在,我想使用Autofac将
AnonymousUserService
AnonymousUserLastActivityUpdater
连接起来,并将
UserService
LastActivityUpdater
连接起来

我尝试为装饰器添加一个从基本接口派生的接口,如下所示:

public interface IAnonymousUserLastActivityUpdator : ILastActivityUpdator
{ }
然后我想我可以在
匿名用户服务
构造函数中使用
iAnonymousUserLastActivityUpdater
,一切都会自动连接好

不幸的是,它总是使用第一个实现,即
IAonymousUserLastActivityUpdater
,因为它注册较早(按字母顺序)

我如何才能实现
AnonymousUserService
注入
AnonymousUserLastActivityUpdater
UserService
注入
LastActivityUpdater
。据我所知,如果您已经在

builder.RegisterType<LastActivityUpdator>();
builder.RegisterType<AnonymousUserLastActivityUpdator>();
builder.RegisterType();

builder.RegisterType)。从类名来看,它看起来像是
AnonymousUserService
只适用于
AnonymousUserLastActivityUpdater
而不是
ILASTativityUpdater
的任何实现。如果是这样的话,那么按照您的建议引入一个不同的抽象(例如,
iAnonymousUserLastActivityUpdater
)。

嗨,Matt,非常感谢。它只与一个
IAonymousUserLastActivityUpdater
一起工作,因此您认为它应该依赖于它是正确的。我认为我的错误是让
iAnonymousUserLastActivityUpdater
iLastactivityUpdater
派生,因此选择了第一个匹配项。今晚我会尽量不让它继承。谢谢。听起来不错,但是你不应该根据你的国际奥委会改变你的设计。如果
iAnonymousUserLastActivityUpdater
iLastactivityUpdater
继承是有意义的,那么应该这样做,并且您可以如上所述设置绑定。祝您好运:)builder.Register(c=>newuserservice(c=>c.Resolve())语法不正确。“名为c的局部变量不能在此范围内声明,因为它将赋予c不同的含义,而c已在`父或当前'范围内用于表示其他内容。不应该有第二个lambda。我已更正了它。它似乎对我有效。我已编写了一个快速
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>());