在if逻辑中调用同一接口和实现的Autofac多个实现



我有一个名为ibaseinterface的接口,我用它创建了两个类,比如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的工作只是返回一个IBaseInterfaceFactory的情况下,在这种情况下,caetoplevel已经充当了工厂,在那种情况下,它可以从等式中完全减少。

最新更新