回到目录
对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofac注册到运行时中,然后在使用时通过PluginManager对象进行获取,即所有模块只注册一次,在使用时只是从容器中取出实例的过程,这也保证的程序的性能!
Lind.DDD.Plugins设计图
一个接口,多个实现,根据具体业务,生产不同的实例,生产的过程前制到程序启动时,后期的使用直接从容器中获取,由于是key/value结构,所有获取的时间复杂度为O(1)
/// <summary> /// 可插拔组件的管理者 /// Author:Lind /// 依赖于Autofac /// </summary> public class PluginManager { /// <summary> /// 插件容器辅助字段 /// </summary> private static IContainer _container = null; /// <summary> /// 互斥锁 /// </summary> private static object lockObj = new object(); /// <summary> /// 类的构造方法 /// </summary> static PluginManager() { lock (lockObj) { if (_container == null) { lock (lockObj) { try { Console.WriteLine("开始注册(IPlugins)所有插件..."); var builder = new ContainerBuilder(); foreach (var item in AssemblyHelper.GetTypesByInterfaces(typeof(IPlugins))) { builder.RegisterType(item) .Named(item.FullName, item.GetInterfaces().FirstOrDefault()); } _container = builder.Build(); } catch (Exception) { throw new ArgumentException("PluginManager依赖于autofac包包..."); } } } } } /// <summary> /// 从插件容器里返回对象 /// </summary> /// <param name="serviceName"></param> /// <param name="serviceType"></param> /// <returns></returns> public static object Resolve(string serviceName, Type serviceType) { return _container.ResolveNamed(serviceName, serviceType); } /// <summary> /// 从插件容器里返回对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="serviceName"></param> /// <returns></returns> public static TService Resolve<TService>(string serviceName) { return _container.ResolveNamed<TService>(serviceName); } }
通过这个Lind.DDD.Plugins的设计,让我们再次领略了IoC容器的魅力,当然它的基于还是接口,多态和面向对象的基本性质,所以,学好基础才是重中之重!
感谢各位的阅读,非常各位多多关注仓储大叔框架
回到目录
原标题:Lind.DDD.Plugins~插件模式的集成
关键词: