【发布时间】:2017-01-29 15:27:21
【问题描述】:
假设我有一个强名称程序集 Interfaces.dll 的版本 1,其中包含一个 IPlugin 接口:
public interface IPlugin
{
void InstallSelf(IPluginManager pluginManager);
}
已经实现了一些插件,一切运行顺利。
有一天,我们决定插件可能应该有名字,这样我们才能看到我们加载了哪些插件。因此,我们生成了Interfaces.dll 的第 2 版,其中包含:
public interface IPlugin
{
string PluginName { get; }
void InstallSelf(IPluginManager pluginManager);
}
因为我不能指望所有插件实现者都立即更新他们的插件,所以我想创建一个适配器,将“未知”的插件名称添加到旧插件版本。有没有办法实现这样的适配器?我希望它看起来像这样:
public sealed class PluginAdapter_v1_v2 : IPlugin[v2]
{
private readonly IPlugin[v1] _plugin;
public PluginAdapter_v1_v2(IPlugin[v1] plugin)
{
_plugin = plugin;
}
public string PluginName => "Unknown";
public void InstallSelf(IPluginManager pluginManager)
{
_plugin.InstallSelf(pluginManager);
}
}
但是因为它们都被称为IPlugin,所以这行不通。另一种方法是将IPlugin 重命名为IPlugin_v1 和IPlugin_v2,或者对其命名空间进行类似的重命名,但这需要在每次有Interfaces.dll 的新版本时重命名接口(或命名空间) ,并且将要求实现者在更新到最新的程序集版本时更改对接口(或命名空间)的所有引用。那么,问题又来了:
是否可以在不重命名IPlugin 或其命名空间的情况下实现这种适配器?
【问题讨论】:
标签: c# api-versioning