gpt4 book ai didi

c# - 使用 Autofac 在两个 Controller 中获得不同的界面

转载 作者:行者123 更新时间:2023-11-30 20:35:19 26 4
gpt4 key购买 nike

我想在不同的 Controller 中使用不同的接口(interface)。

public interface IMessenger {
Id {get; set;}
void Send();
}

我有两个类实现了两个相同的接口(interface)。

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

两个 Controller :

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

Autofaq 设置:

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

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

如何在 HomeController 中获取 SmsSender 和在 Home2Controller 中获取 MailSender

最佳答案

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

builder.RegisterType<Service>()
.As<IService>()
.WithParameter((pi, c) => pi.ParameterType == typeof(IDependency),
(pi, c) => new XDependency());

为了避免new XDependency代码并让 Autofac 创建依赖项,您可以解析命名注册。

builder.RegisterType<XDependency>().Named<IDependency>("X");
builder.RegisterType<YDependency>().Named<IDependency>("Y");

并使用 c.ResolveNamed<IDependency>("X") 解决它

另一种解决方案是让组件使用 IIndex<TKey, TService> 选择它想要的依赖项.要使用它,您必须注册您的 IDependency作为命名注册并注入(inject) IIndex<String, IDependency> .

public class Service 
{
public Service(IIndex<String, IDependency> dependencies)
{
this._dependency = dependencies["X"];
}

private readonly IDependency _dependency;
}

有关更多信息,您可以查看 autofac 文档中的常见问题解答:How do I pick a service implementation by context

关于c# - 使用 Autofac 在两个 Controller 中获得不同的界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com