假设我有一个强名称程序集的版本 1 Interfaces.dll
,其中包含一个IPlugin
接口:
public interface IPlugin
{
void InstallSelf(IPluginManager pluginManager);
}
已经实现了许多插件,一切运行顺利。
有一天,我们决定插件可能应该有名字,这样我们才能看到我们加载了哪些插件。因此,我们制作了包含以下内容的版本 2 Interfaces.dll
:
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
and IPlugin_v2
,或对其命名空间进行类似的重命名,但这将要求每次有新版本时重新命名接口(或命名空间)Interfaces.dll
,并且需要实现者更改对接口的所有引用(或命名空间)更新到最新的程序集版本。那么,问题又来了:
IPlugin
是否可以在不重命名或其命名空间的情况下实现这种适配器?