【发布时间】:2019-03-08 10:55:17
【问题描述】:
我将 Nuget 包库中的一个接口拆分为一个更简单的基本接口(原始接口没有一个属性),并使原始接口派生自新的基本接口。
使用应用程序的实例化通过托管可扩展性框架 (MEF) 进行,使用带有 [Import] 属性的属性注入,以及带有 [Export(typeof(IFooConfigurations))] 的实现
对于使用旧接口和实现的应用程序,这不应该是一个重大更改。但在某些情况下,会加载不同的库,它们使用旧的接口版本和实现。这会导致运行时出现 MissingMethodExceptions,表示方法或属性(get 方法)不存在 - 例如示例中的 Configurations 列表属性。
旧:
public interface IFooConfigurations
{
int ConfigurationsIdentifier { get; }
IReadOnlyList<Configuration> Configurations { get; }
}
新功能:
public interface IBaseFooConfigurations
{
// without the ConfigurationsIdentifier
IReadOnlyList<Configuration> Configurations { get; }
}
public interface IFooConfigurations : IBaseFooConfigurations
{
int ConfigurationsIdentifier { get; }
// Configurations inherited from IBaseFooConfigurations
}
实施(未更改)
[Export(typeof(IFooConfigurations)]
public class FooConfigurations : IFooConfigurations
{
// implementations of ConfigurationsIdentifier and Configurations
}
用法(未更改),通过 MEF 解决
public class FooApplicationClass
{
[Import]
private IFooConfigurations ConfigurationsOwner { get; set; }
}
很难跟踪此错误并找到可能的原因,因为它不会发生在通常的开发环境中。
这可能是一个解决方案,使用new 关键字在新版本的IFooConfigurations 接口中复制现在位于基本接口中的所有旧属性和方法,同时仍然从新版本派生IBaseFooConfigurations?
可能的解决方案?
public interface IFooConfigurations : IBaseFooConfigurations
{
int ConfigurationsIdentifier { get; }
new IReadOnlyList<Configuration> Configurations { get; }
}
编辑:似乎保留原始接口的成员,用“new”关键字隐藏继承的成员,解决了问题。可能,使用原始接口的旧应用程序和库无法将继承的成员解析为原始接口的一部分。但是,显式实现和模拟可能会带来麻烦。还有待测试。
【问题讨论】:
-
可能是某处的参考文献......
标签: c# .net interface mef missingmethodexception