在 if 逻辑中调用同一接口和实现的 Autofac 多个实现
Posted
技术标签:
【中文标题】在 if 逻辑中调用同一接口和实现的 Autofac 多个实现【英文标题】:Autofac multiple implementation of same interface and implements are called in a if logic 【发布时间】:2020-08-10 01:33:08 【问题描述】:我有一个名为 ibaseinterface 的接口,我使用它创建了 2 个类,比如说 baseclass1 和 baseclass2。
现在我有一个名为***的类,如下所示
public class toplevel
public ibaseinterface selection(string selection)
int.TryParse(selection, out int sel);
if (sel < 2)
return new baseclass1();
else
return new baseclass2();
根据用户输入,我选择需要调用的类。那么如何解决依赖关系,在这种情况下,使用 autofac。
注意:我绝对不能为基类设置不同的接口。
【问题讨论】:
【参考方案1】:如果您需要根据一些运行时数据来选择实现,三种典型的解决方案是:
代理设计模式 适配器设计模式 工厂设计模式。这是工厂设计模式的一个例子:
public interface IBaseInterfaceFactory
ibaseinterface selection(string selection);
public class toplevel
private readonly IBaseInterfaceFactory factory;
public toplovel(IBaseInterfaceFactory factory) => this.factory = factory;
public ibaseinterface selection(string selection)
return this.factory.selection(selection);
// This class depends on Autofac and should therefore be placed near your Autofac
// registations.
internal class AutofacBaseInterfaceFactory : IBaseInterfaceFactory
private readonly IComponentContext context;
public AutofacBaseInterfaceFactory(IComponentContext context) =>
this.context = context;
public ibaseinterface selection(string selection)
int.TryParse(selection, out int sel);
if (sel < 2)
return this.context.Resolve<baseclass1>();
else
return this.context.Resolve<baseclass2>();
这可以使用以下代码进行连接:
builder.RegisterType<toplevel>().AsSelf();
builder.RegisterType<AutofacBaseInterfaceFactory>().As<IBaseInterfaceFactory>();
builder.RegisterType<baseclass1>().AsSelf();
builder.RegisterType<baseclass2>().AsSelf();
请注意,如果toplevel
的工作只是返回一个IBaseInterfaceFactory
,那么cae toplevel
已经充当工厂,在这种情况下,它可以完全从等式中减少。
【讨论】:
以上是关于在 if 逻辑中调用同一接口和实现的 Autofac 多个实现的主要内容,如果未能解决你的问题,请参考以下文章