design-patterns - 在 if 逻辑中调用同一接口和实现的 Autofac 多个实现
问题描述
我有一个名为 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。
注意:我绝对不能为基类设置不同的接口。
解决方案
如果您需要根据一些运行时数据来选择实现,三种典型的解决方案是:
- 代理设计模式
- 适配器设计模式
- 工厂设计模式。
下面是工厂设计模式的一个例子:
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
的工作只是返回 a IBaseInterfaceFactory
,因为 caetoplevel
已经充当了工厂,在这种情况下,它可以从等式中完全减少。
推荐阅读
- pandas - 与首先选择列相比,对整个数据框进行分组,然后是过滤列是否占用更多内存?
- intellij-idea - IntelliJ - 前一天的提示
- rtmp - RTMP客户端什么时候发起deletestream()的操作
- datetime - 在 Azure 突触复制数据工具期间添加具有当前日期的附加列
- java - 如何在 ViewPage 中从 Activity 移动到 Fragment?未找到片段 ID 的视图
- javascript - 比较两个 Json 对象的值并找出使用 Java Script 的差异
- react-native - React Native 与 M1 芯片
- python - 如何从其他路径导入自己编写的python文件?
- docker - Docker COPY 440K 耗时超过 2 分钟
- c - 我的代码有什么问题?为什么它不被接受为 uri 问题编号:1040