Вы можете создать объект фабрики для реализации и каждого из ваших декораторов, и заставить фабрики декораторов действовать как декораторы для фабрики реализации и просто передать входные данные в вызов разрешения. Те, которые вы, вероятно, настроите при запуске приложения или в каком-либо файле конфигурации.
Чтобы быть очень гибким, я бы сделал фабрику, которая берет
Func<IMyInterface, IMyInterface>
или даже
Func<IMyInterface, string, IMyInterface>)
чтобы он мог создать любую имплементацию IMyInterface, которую вы хотите.
Так что-то вроде этого
interface IMyInterfaceFactory
{
IMyInterface Resolve(string parameter);
}
class DecoratorFactory : IMyInterfaceFactory
{
IMyInterfaceFactory parent;
Func<IMyInterface, string, IMyInterface> resolver;
public DecoratorFactory(
IMyInterfaceFactory parent,
Func<IMyInterface, string, IMyInterface> resolver)
{
this.parent = parent;
this.resolver= resolver;
}
public IMyInterface Resolve(string parameter)
{
var decoratee = parent.Resolve(parameter);
return resolver(decoratee, parameter);
}
}
И если вам нужны более сложные операции в методе Resolve, такие как выбор между несколькими родителями или делегатами распознавателя, тогда вы можете просто сделать другую реализацию фабричного интерфейса для них.