C# 使用Autofac在两个控制器中获得不同的接口

C# 使用Autofac在两个控制器中获得不同的接口,c#,asp.net-mvc,autofac,C#,Asp.net Mvc,Autofac,我想在不同的控制器中使用不同的接口 public interface IMessenger { Id {get; set;} void Send(); } 我有两个类实现了两个相同的接口 public class SmsSender : IMessenger { public Id {get; set;} public void Send() { //logic here } } public class MailSender

我想在不同的控制器中使用不同的接口

public interface IMessenger {
    Id {get; set;}
    void Send();
}
我有两个类实现了两个相同的接口

public class SmsSender : IMessenger {
    public Id {get; set;}
    public void Send() {
         //logic here
    }    
}

public class MailSender : IMessenger {
    public Id {get; set;}
    public void Send() {
         //logic here
    }    
}
两个控制器:

public class HomeController : Controller {

    private readonly IMessenger _messenger;

    public HomeController(IMessenger messenger) {
        _messenger = messenger;
    }
}


public class Home2Controller : Controller {

    private readonly IMessenger _messenger;

    public HomeController(IMessenger messenger) {
        _messenger = messenger;
    }
}
自动常见问题解答设置:

builder.RegisterType<MailSender>().As<IMessenger>().InstancePerLifetimeScope();

builder.RegisterType<SmsSender>().As<IMessenger>().InstancePerLifetimeScope();

如何在HomeController中获取SmsSender,在Home2Controller中获取MailSender?

您不能。Autofac无法找出差异。最好将它们分成两个不同的接口,将需要的接口注入控制器。从设计的角度来看,依赖性也更加清晰。如果需要,两个接口都可以实现IMessenger。

注册组件时,可以使用WithParameter方法告诉Autofac要选择哪个依赖项

并使用c.ResolveNamedX解析它

另一个解决方案是让组件使用IIndex选择它想要的依赖项。要使用它,您必须将IDependency注册为命名注册并注入IIndex


有关更多信息,您可以查看autofac文档中的常见问题解答:

您是否在使用其他IOC容器中打开?我相信Ninject有这个特性,可能是
builder.RegisterType<Service>()
       .As<IService>()
       .WithParameter((pi, c) => pi.ParameterType == typeof(IDependency),
                      (pi, c) => new XDependency());
builder.RegisterType<XDependency>().Named<IDependency>("X");
builder.RegisterType<YDependency>().Named<IDependency>("Y");
public class Service 
{
    public Service(IIndex<String, IDependency> dependencies)
    {
        this._dependency = dependencies["X"]; 
    }

    private readonly IDependency _dependency;
}