基于ABP模块组件与依赖注入组件的项目插件开发
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础。
模块系统: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
基于ABP模块组件与依赖注入组件的项目插件开发的更多相关文章
- 【Unity】微软的一款依赖注入组件
前言 前面学习了autofac这个依赖注入组件,本来是打算写在一起的,因为这个组件没打算像autofac一样详细的写,只是写下以前自己鼓捣玩搭建框架然后使用的一个依赖注入组件,并且也是进行了封装使用. ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(七)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
随机推荐
- umi中使用scss
在umi中可以直接使用css,但是并不支持scss,我们需要加两个loader, 直接npm安装 node-sass和sass-loader 即可,剩余的事情umi已经帮我们做好了. npm i -- ...
- 使用ionic2开发一个二维码扫描功能
界面添加一个按钮: <button ion-button block color="secondary" class="Scan-button" (cli ...
- [转] 又踩到了crontab的老坑,特意记录下。
http://xiachaofeng.iteye.com/blog/1405184 今天遇见一个问题,crontab的定时任务不能自动执行,但是手动执行脚本一直能成功.查到最后,发现是脚本里用了系统的 ...
- brew 源 & pip 源
brew源: https://www.zhihu.com/question/31360766 摘要 1. 替换formula 索引的镜像(即 brew update 时所更新内容) cd " ...
- geohash编码算法在LBS中的应用
随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标: 查找附近的某某 ...
- js模拟发送 FormData数据
后台express需要connect-multiparty模块接收formData的数据类型 class ourFormData { constructor(data, rs) { return ne ...
- 浅谈Observer在代码中表现形式
说到观察者模式,基本在软件工程领域中是应用广泛,不知道的可以先学习一番,下面给个快速的回顾,然后在通过一个grpc中的responseObserver谈下观察者对象在代码中的位置. 喜欢类图,就不上其 ...
- Oracle 创建表 Create Table...
一.创建表 主键约束primary key 约束条件,唯一且非空,一个表中只能有一个主键:有多个字段联合作为主键时,合在一起唯一标识记录,叫做联合主键. 外键约束 foreign key 受另外一张表 ...
- PHP合并数组及去重
本文介绍的是一维数组的去重 合并数组的方法 array_merge: 数字键,直接往后添加,key重置 字符串键,后面的数组的值会替代前面的值 +: 数字键,后面的数组的值不会替代前面的值 字符串键, ...
- python全栈开发 * 07知识点汇总 * 180607
07 set集合,深浅拷⻉以及部分知识点补充 一.while,for 循环知识点补充 二.int, str的相关操作 1.列表变字符串 # lst=["红","橙&qu ...