Если вам нужно выбрать реализацию, основанную на некоторых данных времени выполнения, три типичных решения:
- Шаблон проектирования Proxy
- Шаблон проектирования Adapter
- Шаблон фабричного дизайна.
Вот пример шаблона фабричного дизайна:
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
уже действует как фабрика, и в этом случае она может быть полностью уменьшена из уравнения.