MEF接口可选Void方法实现:C#自托管WebAPI插件开发疑问
解决方案:利用C# 8.0+的接口默认实现特性
既然你能维护这个接口,那最贴合你需求的方案就是用C# 8.0引入的接口默认方法,直接给OnEnd添加空实现,这样插件开发者就不用强制实现这个方法了,同时接口还能保持单一,不用拆分。
修改你的接口定义
给OnEnd方法加上默认的空实现:
[InheritedExport] public interface IMyPlugin { // 必须实现的方法,无默认实现 void OnStart(); // 可选实现的方法,提供默认空实现 void OnEnd() { } }
插件类的简化实现
现在你的插件类只需要实现OnStart即可,完全不用管OnEnd:
[Export(typeof(IMyPlugin))] // 这里注意你之前代码里的`AnotherTYpe`应该是笔误,应该导出IMyPlugin类型 [ExportMetadata("DisplayName", "My Plugin")] [ExportMetadata("Description", "blabla")] [ExportMetadata("Version", "1.0")] public class ServiceTasks : IMyPlugin { [Import("IMyPlugin", typeof(IMyPlugin))] public IHost Host { get; set; } public void OnStart() { // 这里写你的插件启动逻辑 } // 不用写OnEnd了,自动使用接口的默认空实现 }
关键注意事项
- C#版本要求:确保你的项目使用C# 8.0或更高版本。如果是旧项目,可以在
.csproj文件里设置:<PropertyGroup> <LangVersion>8.0</LangVersion> </PropertyGroup> - MEF兼容性:MEF(包括
System.ComponentModel.Composition)对接口默认方法的支持是完全没问题的——默认方法属于接口的一部分,插件类没有重写的话会自动继承这个实现,导出导入过程不会有任何异常。 - 灵活性保留:如果后续有插件需要自定义
OnEnd的逻辑,依然可以在插件类里重写这个方法,完全不影响现有逻辑。
这种方案既满足了你“不拆分接口”的要求,又实现了可选方法的需求,比拆分多个接口更简洁。
内容的提问来源于stack exchange,提问作者Cabole
相关产品推荐
相关产品推荐

