You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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了,自动使用接口的默认空实现
}

关键注意事项

  1. C#版本要求:确保你的项目使用C# 8.0或更高版本。如果是旧项目,可以在.csproj文件里设置:
    <PropertyGroup>
        <LangVersion>8.0</LangVersion>
    </PropertyGroup>
    
  2. MEF兼容性:MEF(包括System.ComponentModel.Composition)对接口默认方法的支持是完全没问题的——默认方法属于接口的一部分,插件类没有重写的话会自动继承这个实现,导出导入过程不会有任何异常。
  3. 灵活性保留:如果后续有插件需要自定义OnEnd的逻辑,依然可以在插件类里重写这个方法,完全不影响现有逻辑。

这种方案既满足了你“不拆分接口”的要求,又实现了可选方法的需求,比拆分多个接口更简洁。

内容的提问来源于stack exchange,提问作者Cabole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:56:02