在 if 逻辑中调用相同接口和实现的 Autofac 多个实现
Autofac multiple implementation of same interface and implements are called in a if logic
我有一个名为 ibaseinterface 的接口,我使用它创建了 2 个 classes 让我们说 baseclass1 和 baseclass2.
现在我有一个 class 命名为顶级
public class toplevel
{
public ibaseinterface selection(string selection)
{
int.TryParse(selection, out int sel);
if (sel < 2)
return new baseclass1();
else
return new baseclass2();
}
}
根据用户输入我 select 需要调用 class。那么如何解决依赖关系,在这种情况下,使用 autofac。
Note: I definitely can't have different interfaces for the base classes.
如果您需要select基于一些运行时数据的实现,三个典型的解决方案是:
- 代理设计模式
- 适配器设计模式
- 工厂设计模式。
这里有一个工厂设计模式的例子:
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
的工作只是 return 一个 IBaseInterfaceFactory
的情况下,因为 toplevel
已经作为工厂,并且在在这种情况下,它可以从等式中完全减少。
我有一个名为 ibaseinterface 的接口,我使用它创建了 2 个 classes 让我们说 baseclass1 和 baseclass2.
现在我有一个 class 命名为顶级
public class toplevel
{
public ibaseinterface selection(string selection)
{
int.TryParse(selection, out int sel);
if (sel < 2)
return new baseclass1();
else
return new baseclass2();
}
}
根据用户输入我 select 需要调用 class。那么如何解决依赖关系,在这种情况下,使用 autofac。
Note: I definitely can't have different interfaces for the base classes.
如果您需要select基于一些运行时数据的实现,三个典型的解决方案是:
- 代理设计模式
- 适配器设计模式
- 工厂设计模式。
这里有一个工厂设计模式的例子:
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
的工作只是 return 一个 IBaseInterfaceFactory
的情况下,因为 toplevel
已经作为工厂,并且在在这种情况下,它可以从等式中完全减少。