基于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

时间: 2024-12-18 13:38:51

基于ABP模块组件与依赖注入组件的项目插件开发的相关文章

使用Roboguice依赖注入规划Android项目

关于依赖注入 Dependency Injection( 依赖注入)可以很好的帮助我们分离模块,降低耦合.提高可测试性.(PS:Roboguice 只是一个工具,依赖注入更多的是一种思想) 通常博主开发项目时喜欢以Activity .Service 等组件作为顶级层入口,辅以各类接口作为业务服务.Activity 主要负责维护界面相关的东西,及提供功能所需要的上下文环境,引入功能实现需要的接口. 这些接口的实例通过Roboguice进行注入.(当然你也可以完全不使用Roboguice,但还是建议

Abp 源码研读 - 依赖注入

Abp 框架对于依赖注入的实现主要是依赖 Castle.Core ,实际上这一篇更应该归类于 Castle.Core 的应用, 若对 Castle.Core 知识不了解的, 可以先去学习下:Castle.Core .下面来分析下比较重要的接口/类: 核心接口 IIocManager 定义了对 Ioc 对象, 服务注册,服务解析,服务注册与否的判断,以及对解析对象的释放. IocManager 实现了 IIocManager 接口, 这里需要特别注意的是:对于长时间运行的程序,比如网站,Windo

ABP 结合 MongoDB 集成依赖注入

1.我们再ABP项目添加一个.NET Core类库  类库名自定定义, 我这里定义为 TexHong_EMWX.MongoDb 添加NuGet包. ABP mongocsharpdriver 添加 AbpMongoDbConfigurationExtensions.cs /// <summary> /// 定义扩展方法 <see cref="IModuleConfigurations"/> 允许配置ABP MongoDB模块 /// </summary&g

Asp.Net Core 3.1 Api 集成Abp项目依赖注入

Abp 框架 地址https://aspnetboilerplate.com/ 我们下面来看如何在自己的项目中集成abp的功能 我们新建core 3.1 API项目和一个core类库 然后 两个项目都要安装Abp Nuget Package 版本为5.1.0 如上图,在Application项目新建项目模块类,Initialize方法中,会在启动时扫描dll中需要依赖注入的类和接口 如上图,在ApiHost项目新建项目模块类,该项目依赖Application项目 在Application 建立Q

2.3了解AngularJS模块和依赖注入

1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 可通过定义其提供的对象构建模块.通过依赖注入将模块连接在一起,构建一个完整的应用程序. AngularJS建立在模块原理上.大部分AngularJS提供的功能都内置到ng-*模块中. 2.依赖注入 定义依赖对象并动态地把它注入另一个对象,使得所有的依赖对象所提供的功能都能使用.(提供器 注入器服务)

angularjs学习笔记--$http、数据渲染到表格、路由、依赖注入、provider

1—$http 可以从服务器中获取更大的数据集,这里使用angularjs的内置服务称为$http.使用angularjs的依赖注入为phoneList组件的控制器提供服务. 在我们的控制器中使用angularjs的$http服务,向我们的web服务器发出http请求,以获取文件中的数据. app/phone-list/phone-list.component1.js: angular.module('phoneList').component('phoneList',{ templateUrl

Spring3(一) 控制反转(IoC)和依赖注入(DI)

几个常用框架之间的关系 1       spring框架概述 1.1   什么是spring Spring是一个开源.轻量级的Java 开发框架.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring的核心是控制反转(IoC)和面向切面(AOP). 轻量级指的是:与EJB对比,依赖资源少,销毁的资源少. 分层: 一站式,每一个层都提供了解决方案:但是又可以只选择其中一层 web层:struts,spring-MVC se

Angular08 依赖注入

1 angular应用中依赖注入的工作原理 angular会到组件的控制类中的构造器中去查看需要进行依赖注入的对象类型,然后根据这个类型到提供器中去寻找和这个类型同名的token,然后根据token后面的注册方式来创建需要的实例,最后再把这个实例赋值给构造器中对应类型的形参 2 注入器 就是组件控制类中的构造函数 3 提供器 3.1 模块配置文件中的 providers 属性 3.2 组件@Component中的 providers  属性 3.3 注意:这两种方法的用法一致,只是作用域有区别:

[转]解读ASP.NET 5 &amp; MVC6系列(7):依赖注入

本文转自:http://www.cnblogs.com/TomXu/p/4496440.html 在前面的章节(Middleware章节)中,我们提到了依赖注入功能(Dependency Injection),ASP.NET 5正式将依赖注入进行了全功能的实现,以便开发人员能够开发更具弹性的组件程序,MVC6也利用了依赖注入的功能重新对Controller和View的服务注入功能进行了重新设计:未来的依赖注入功能还可能提供更多的API,所有如果还没有开始接触依赖注入的话,就得好好学一下了. 在之