基于ABP模块组件与依赖注入组件的项目插件开发
2017-04-13 00:52
369 查看
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础。
模块系统:http://www.cnblogs.com/mienreal/p/4537522.html
依赖注入:http://www.cnblogs.com/mienreal/p/4550500.html
正文:
我最近在设计一个项目,而这个项目的一些业务功能,需要以插件的方式提供给这个项目,从而降低耦合性,主项目不会对具体业务功能产生依赖。
在以前,最简单粗暴的方式,就是扫描主程序目录下的所有dll或指定目录下的dll,然后反射生成运行时对象。
现在,由于整个项目,采用了依赖注入,包括插件项目也是如此。
虽然经常用ABP开发项目,并且偶尔阅读ABP相关技术文章,但是却不知道ABP有提供插件组件。
在不知道ABP插件组件之前,使用依赖注入的情况下,我找不到比较灵活简洁的方式,为主程序提供插件功能。
很是苦恼,经过一番搜索,找到了ABP官方Github里的Sample项目:https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/PlugInDemo 才知道有这个插件组件。
有这个插件组件,要做插件式项目开发就容易多了。
我另外写了个基于ABP的控制台Demo项目,做下备忘吧。
插件式开发,有几个需要注意的地方:
1.在主项目,需要这一句代码:booter.PlugInSources.AddFolder(path);
通知ABP的Module系统和DI系统,这个目录下也有dll需要扫描和初始化。
2.每个插件项目,需要添加一个AbpModule派生类。
因为ABP只扫描包含有AbpModule派生类的程序集,所有你需要创建一个AbpModule派生类来告诉ABP,这里也需要扫描和初始化。
3.每个插件接口/类,需要继承ISingletonDependency,ITransientDependency等位于Abp.Dependency命令空间下的Dependency接口。
ABP会扫描所有继承了这些接口的接口/类,自动帮你解决依赖关系,并且创建相关的依赖对象。
一个比较简单的AbpModule派生类,如下:
一般情况下,每个AbpModule派生类,都应该用IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());这一句代码重写Initalize方法。
项目结构图:
目录结构图:
项目Demo下载:http://files.cnblogs.com/files/VAllen/AbpConsoleAppDemo.7z
或Github:https://github.com/VAllens/AbpConsoleAppDemo.git
模块系统:http://www.cnblogs.com/mienreal/p/4537522.html
依赖注入:http://www.cnblogs.com/mienreal/p/4550500.html
正文:
我最近在设计一个项目,而这个项目的一些业务功能,需要以插件的方式提供给这个项目,从而降低耦合性,主项目不会对具体业务功能产生依赖。
在以前,最简单粗暴的方式,就是扫描主程序目录下的所有dll或指定目录下的dll,然后反射生成运行时对象。
现在,由于整个项目,采用了依赖注入,包括插件项目也是如此。
虽然经常用ABP开发项目,并且偶尔阅读ABP相关技术文章,但是却不知道ABP有提供插件组件。
在不知道ABP插件组件之前,使用依赖注入的情况下,我找不到比较灵活简洁的方式,为主程序提供插件功能。
很是苦恼,经过一番搜索,找到了ABP官方Github里的Sample项目:https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/PlugInDemo 才知道有这个插件组件。
有这个插件组件,要做插件式项目开发就容易多了。
我另外写了个基于ABP的控制台Demo项目,做下备忘吧。
using System; using System.IO; using Abp; using Abp.PlugIns; namespace ConsoleApp { public class Program { private static void Main(string[] args) { Console.WriteLine("Create AbpBootstrapper."); using (var booter = AbpBootstrapper.Create<ConsoleAppModule>()) { var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PlugIns"); Console.WriteLine("path is " + path); booter.PlugInSources.AddFolder(path); Console.WriteLine("Added PlugIns Directory is completed."); booter.Initialize(); Console.WriteLine("Initialize DI is completed."); var test = booter.IocManager.Resolve<TestDI>(); test.Run(); var test2 = booter.IocManager.Resolve<TestDI>(); test2.Run(); } Console.WriteLine("Dispose AbpBootstrapper."); Console.ReadKey(); } } }
插件式开发,有几个需要注意的地方:
1.在主项目,需要这一句代码:booter.PlugInSources.AddFolder(path);
通知ABP的Module系统和DI系统,这个目录下也有dll需要扫描和初始化。
2.每个插件项目,需要添加一个AbpModule派生类。
因为ABP只扫描包含有AbpModule派生类的程序集,所有你需要创建一个AbpModule派生类来告诉ABP,这里也需要扫描和初始化。
3.每个插件接口/类,需要继承ISingletonDependency,ITransientDependency等位于Abp.Dependency命令空间下的Dependency接口。
ABP会扫描所有继承了这些接口的接口/类,自动帮你解决依赖关系,并且创建相关的依赖对象。
一个比较简单的AbpModule派生类,如下:
using System.Reflection; using Abp.Modules; namespace ConsoleApp.AsynStrategy { public class ConsoleAppAsynStrategyModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } }
一般情况下,每个AbpModule派生类,都应该用IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());这一句代码重写Initalize方法。
项目结构图:
目录结构图:
项目Demo下载:http://files.cnblogs.com/files/VAllen/AbpConsoleAppDemo.7z
或Github:https://github.com/VAllens/AbpConsoleAppDemo.git
相关文章推荐
- 基于DDD的.NET开发框架 - ABP依赖注入
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 模块插件组织
- [JS]基于JQ库的组件开发和插件扩展
- requirejs结合text.js及css.js等插件实现模块依赖开发(打包案例)
- 为了后面自动化部署,需要整理公司项目的maven依赖关系,eclipse下maven组件的安装以及用eclipse构建maven多模块工程(即有父子依赖关系的工程)遇到一个class not fond
- 在MVC3项目中结合NInject组件实现依赖注入的设计
- Castle学习笔记----将Castle IOC引入项目开发中实现“依赖注入”
- Eclipse 使用svn插件检出maven项目,启动服务时提示依赖注入失败
- 在MVC3项目中结合NInject组件实现依赖注入的设计
- 通达OA 公告管理模块增加管理项目,使用OA系统组件开发(图文)
- 将Castle IOC引入项目开发中实现“依赖注入”
- 查看某个程序所依赖的组件assembly版本,如基于哪个版本的framework开发的
- 基于项目需求开发JMeter插件
- 在多模块开发的时候,利用项目继承可以将结构信息、部署信息,将共同的依赖放在一个父类中。
- 基于maven开发spring项目需要配置的一些最基础的依赖
- react项目实战(权限模块开发四) SkinDropDown插件开发
- 基于Nexue搭建Android开发模块包依赖服务器
- ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入
- 通达OA 公告管理模块增加管理项目,使用OA系统组件开发(图文)
- 在MVC3项目中结合NInject组件实现依赖注入的设计