То, что вы используете Виндзор, здесь в значительной степени не имеет значения. Всегда стремитесь найти независимое от контейнера решение. Вот один из них:
interface IImportProcessor {
bool CanHandleVersion(int version);
Stream Import(Stream input);
}
class ImportProcessorVersion1 : IImportProcessor {
public bool CanHandleVersion(int version) {
return version == 1;
}
public Stream Import(Stream input) {
// do stuff
return input;
}
}
class ImportProcessorVersion2 : IImportProcessor {
public bool CanHandleVersion(int version) {
return version == 2;
}
public Stream Import(Stream input) {
// do stuff
return input;
}
}
class MainImportProcessor: IImportProcessor {
private readonly IImportProcessor[] versionSpecificProcessors;
public MainImportProcessor(IImportProcessor[] versionSpecificProcessors) {
this.versionSpecificProcessors = versionSpecificProcessors;
}
public bool CanHandleVersion(int version) {
return versionSpecificProcessors.Any(p => p.CanHandleVersion(version));
}
private int FetchVersion(Stream input) {
// do stuff
return 1;
}
public Stream Import(Stream input) {
int version = FetchVersion(input);
var processor = versionSpecificProcessors.FirstOrDefault(p => p.CanHandleVersion(version));
if (processor == null)
throw new Exception("Unsupported version " + version);
return processor.Import(input);
}
}
Ваше приложение будет зависеть от IImportProcessor
. Контейнер подключен так, что реализация этого интерфейса по умолчанию - MainImportProcessor
. Контейнер также подключен так, что MainImportProcessor
получает всех других реализаций из IImportProcessor
.
Таким образом, вы можете добавить реализации IImportProcessor
, и каждая из них будет выбрана в случае необходимости.
Возможно, было бы проще соединить вещи, если MainImportProcessor
реализует интерфейс, отличный от IImportProcessor
.
Другой возможностью может быть внедрение цепочки ответственности .