Fork me on GitHub

[ABP]基于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下载:https://files.cnblogs.com/files/VAllen/AbpConsoleAppDemo.7z

或Github:https://github.com/VAllens/AbpConsoleAppDemo.git

posted @ 2017-04-13 00:52  VAllen  阅读(4721)  评论(6编辑  收藏  举报