理解 MEF
1、它解决什么问题?
考虑下面的需求,甲程序员对外暴露接口,内部提供实现。乙程序员使用甲提供的接口,根据面向接口编程的原则,乙关联一个接口类型的引用。正常情况下,乙要使用甲的实现,必须实例化一个具体对象。有没有更好的办法呢?我们知道Java框架spring中有个依赖注入的概念。C#中能不能使用类似的方式呢?
2、怎么解决?
使用MEF(Managed Extensibility Framework),示例如下:
1 namespace TestMEF 2 { 3 public interface IBookService 4 { 5 void GetBookName(); 6 } 7 8 [Export(typeof(IBookService))] 9 public class ComputerBookService : IBookService 10 { 11 public void GetBookName() 12 { 13 Console.WriteLine("Computer Book"); 14 } 15 } 16 17 [Export(typeof(IBookService))] 18 public class EnglishBookService : IBookService 19 { 20 public void GetBookName() 21 { 22 Console.WriteLine("English Book"); 23 } 24 } 25 26 class Program 27 { 28 //[Import] 29 //public IBookService Service { get; set; } 30 31 [ImportMany] 32 public List<IBookService> ServiceList { get; set; } 33 34 private void Compose() 35 { 36 var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 37 var container = new CompositionContainer(catalog); 38 container.ComposeParts(this); 39 } 40 41 static void Main(string[] args) 42 { 43 Program p = new Program(); 44 p.Compose(); 45 46 //p.Service.GetBookName(); 47 48 foreach (IBookService service in p.ServiceList) 49 { 50 service.GetBookName(); 51 } 52 53 Console.ReadLine(); 54 } 55 } 56 }
说明:有一个实现,使用者那里期望public IBookService Service,有多个实现,使用者期望public List<IBookService> ServiceList 。
3、通过这个示例,更加深刻理解。软件的本质就是封装,操作系统封装硬件,高级编程语言封装操作系统,应用软件封装高级语言,应用软件暴露UI接口给用户使用。软件本质就是封装,对已有的实现进行封装,暴露出更容易的接口。程序员本身是软件开发者,也是软件使用者,使用其他程序员提供的接口,别人提供的接口也可以认为是一个软件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)