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;
}