首页 > 解决方案 > 在 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。

注意:我绝对不能为基类设置不同的接口。

标签: design-patternsdependency-injectionautofac

解决方案


如果您需要根据一些运行时数据来选择实现,三种典型的解决方案是:

  • 代理设计模式
  • 适配器设计模式
  • 工厂设计模式。

下面是工厂设计模式的一个例子:

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已经充当了工厂,在这种情况下,它可以从等式中完全减少。


推荐阅读