我必须在使用Windsor的系统中支持新的输入文件格式。我还需要在过渡阶段支持旧版本的输入文件。 这可能会在将来重复出现,我们将再次需要支持新的和下一个最新的格式。
导入处理由组件处理,新版本在代码方面有了重大改进,与旧版本相比,它更加高效。所以我想做的是让新组件和成为系统中的旧组件,并根据文件元数据动态使用新组件或旧组件。
是否存在任何人都可以建议的此类情景模式?
答案 0 :(得分:2)
你使用Windsor的事实在这里几乎无关紧要。始终努力寻找与容器无关的解决方案。这是一个:
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
不同的界面,则可能更容易接线。
另一种可能性是实施chain of responsibility。