使用Windsor是否有任何组件版本控制和向后兼容性模式?

时间:2010-08-16 00:38:40

标签: inversion-of-control castle-windsor

我必须在使用Windsor的系统中支持新的输入文件格式。我还需要在过渡阶段支持旧版本的输入文件。 这可能会在将来重复出现,我们将再次需要支持新的和下一个最新的格式。

导入处理由组件处理,新版本在代码方面有了重大改进,与旧版本相比,它更加高效。所以我想做的是让新组件成为系统中的旧组件,并根据文件元数据动态使用新组件或旧组件。

是否存在任何人都可以建议的此类情景模式?

1 个答案:

答案 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