当前位置:   article > 正文

abp vnext学习01 - 控制台应用_创建一个abp控制台项目

创建一个abp控制台项目

1. 环境

asp.net core 3.1
abp vnext 4.4.3

2. 创建控制台项目

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3. 安装Microsoft.Extensions.Hosting

在这里插入图片描述
编写代码

using Microsoft.Extensions.Hosting;
using System;

namespace AbpConsole01
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var host = CreateBuilder(args);
            Console.WriteLine("准备启动项目");
            host.StartAsync().Wait();
        }

        static IHostBuilder CreateBuilder(string[] args)
        {
            var host =  Host.CreateDefaultBuilder(args);
            return host;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

4.安装Volo.Abp.Core 4.4.3

在这里插入图片描述

5. 新建ConsoleModule

using System;
using Volo.Abp.Modularity;

namespace AbpConsole01
{
    public class ConsoleModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Console.WriteLine("加载ConsoleModule模块");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

修改Program.cs

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    var host = CreateBuilder(args);
    Console.WriteLine("准备启动项目");
    host.RunConsoleAsync().Wait();
}

static IHostBuilder CreateBuilder(string[] args)
{
    var host = Host.CreateDefaultBuilder(args);
    host = host.ConfigureServices((context, services) =>
    {
        services.AddApplication<ConsoleModule>();
    });
    return host;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

启动项目
在这里插入图片描述

6. 创建hello word service,引入ioc

using System;

namespace AbpConsole01
{
    public class HelloWorldService
    {
        public void Test()
        {
            Console.WriteLine("HelloWorldService");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6.1 第一种 module注册

修改ConsoleModule

using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;

namespace AbpConsole01
{
    public class ConsoleModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            System.Console.WriteLine("加载AbpModuleModule模块");
            context.Services.AddSingleton<HelloWorldService>();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

6.2 实现接口

修改HelloWordService

using System;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    public class HelloWorldService : ISingletonDependency
    {
        public void Test()
        {
            Console.WriteLine("HelloWorldService");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6.3 特性注入

using System;
using Volo.Abp.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class HelloWorldService
    {
        public void Test()
        {
            Console.WriteLine("HelloWorldService");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

module注册会导致代码变多,不易维护
接口注册 缺陷 违反单一职责 建议特性注册

7. 注册ConsoleHostedService

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class ConsoleHostedService : IHostedService
    {
        private readonly HelloWorldService helloWorldService;

        public ConsoleHostedService(HelloWorldService helloWorldService)
        {
            Console.WriteLine("ConsoleHostedService构造函数");
            this.helloWorldService = helloWorldService;
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService启动");
            helloWorldService.Test();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService结束");
            return Task.CompletedTask;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里插入图片描述
ctrl+c停止项目
在这里插入图片描述

8. AbpModule常用方法

在这里插入图片描述
On开头的方法是配置中间件的
Configure是.net 的注册方式
修改ConsuleModule.cs

using Volo.Abp.Modularity;

namespace AbpConsole01
{
    public class ConsoleModule : AbpModule
    {
        /// <summary>
        /// 注册服务之前
        /// 注册数据库 redis rabbitmq
        /// </summary>
        /// <param name="context"></param>
        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            base.PreConfigureServices(context);
        }

        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            System.Console.WriteLine("加载AbpModuleModule模块");
        }

        /// <summary>
        /// 服务注册之后执行
        /// 加载redis分布式缓存
        /// </summary>
        /// <param name="context"></param>
        public override void PostConfigureServices(ServiceConfigurationContext context)
        {
            base.PostConfigureServices(context);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

9. 使用autofac

安装Volo.Abp.Autofac 4.4.3
在这里插入图片描述
修改Program.cs

static IHostBuilder CreateBuilder(string[] args)
{
     var host = Host.CreateDefaultBuilder(args);
     host = host.UseAutofac();
     host = host.ConfigureServices((context, services) =>
     {
         services.AddApplication<ConsoleModule>();
     });
     return host;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改ConsoleModule

using System;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;

namespace AbpConsole01
{
    [DependsOn(typeof(AbpAutofacModule))]
    public class ConsoleModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Console.WriteLine("加载ConsoleModule模块");
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

修改ConsoleHostedService

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class ConsoleHostedService : IHostedService
    {
        public HelloWorldService HelloWorldService { get; set; }
        
        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService启动");
            HelloWorldService.Test();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService结束");
            return Task.CompletedTask;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

测试
在这里插入图片描述
模块化思想:开发效率提升,维护量降低

10.引用类库

新建.net core3.1类库,名字叫Common
安装nuget包Volo.Abp.Core 4.4.3
新建CommonModule.cs

using System;
using Volo.Abp.Modularity;

namespace Common
{
    public class CommonModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Console.WriteLine("加载CommonModule");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

AbpConsole01添加对于Common类库的引用
修改ConsoleModule.cs

using Common;
using System;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;

namespace AbpConsole01
{
    [DependsOn(
        typeof(AbpAutofacModule),
        typeof(CommonModule))]
    public class ConsoleModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Console.WriteLine("加载ConsoleModule模块");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

启动项目
在这里插入图片描述
可以看到先加在了CommonModule然后又加载了ConsoleModule
在Common类库下新建CommonService.cs

using System;

namespace Common
{
	[Dependency(ServiceLifetime.Singleton)]
    public class CommonService
    {
        public void Test()
        {
            Console.WriteLine(" Hello CommonService ");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

修改ConsoleHostedService.cs添加对于CommonService的引用

using Common;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class ConsoleHostedService : IHostedService
    {
        public HelloWorldService HelloWorldService { get; set; }

        public CommonService CommonService { get; set; }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService启动");
            HelloWorldService.Test();
            CommonService.Test();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService结束");
            return Task.CompletedTask;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

启动项目
在这里插入图片描述

11. 引用插件

新建asp.net core3.1的类库项目,名字叫Plugins
安装Volo.Abp.Core 4.4.3
新建PluginModule.cs

using Volo.Abp.Modularity;

namespace Plugins
{
    public class PluginModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            System.Console.WriteLine("PluginModule加载了....");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

生成一下Plugins,将dll复制到一个文件夹下,比如我放到D:\study\dotnet\abpstudy\AbpPlugins
在这里插入图片描述
修改AbpConsole项目下的Program.cs

static IHostBuilder CreateBuilder(string[] args)
{
      var host = Host.CreateDefaultBuilder(args);
      host = host.UseAutofac();
      host = host.ConfigureServices((context, services) =>
      {
          services.AddApplication<ConsoleModule>(options => {
              //加载插件
              options.PlugInSources.AddFolder(@"D:\study\dotnet\abpstudy\AbpPlugins");
          });
      });
      return host;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

启动项目
在这里插入图片描述
可以看到模块加载了,通过分析我们可以看到先加载DependsOn里面的模块,然后加载插件里面的模块,最后加载当前模块,但是如何调用插件里面的方法呢,需要定义一个接口类
新建Plugins.Abstract项目Plugins项目引用当前项目
新建IPluginService

namespace Plugins.Abstract
{
    public interface IPluginService
    {
        public void Test();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Plugins项目下新建PluginService

using Microsoft.Extensions.DependencyInjection;
using Plugins.Abstract;
using System;
using Volo.Abp.DependencyInjection;

namespace Plugins
{
    [Dependency(ServiceLifetime.Singleton)]
    public class PluginService : IPluginService
    {
        public void Test()
        {
            Console.WriteLine("Hello PluginService");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

AbpConsole01添加对于Plugins.Abstract的引用
修改ConsoleHostedService

using Common;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Plugins.Abstract;
using System;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class ConsoleHostedService : IHostedService
    {
        public HelloWorldService HelloWorldService { get; set; }

        public CommonService CommonService { get; set; }

        public IPluginService PluginService { get; set; }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService启动");
            HelloWorldService.Test();
            CommonService.Test();
            PluginService.Test();
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService结束");
            return Task.CompletedTask;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

重新生成plugin然后放到插件的文件夹下
在这里插入图片描述
启动之后报错
在这里插入图片描述
重新生成一下项目,将dll全部复制过去
在这里插入图片描述
重新启动
在这里插入图片描述
经过测试是缓存问题,其实只需要更换Plugins.dll
在这里插入图片描述

修改PluginService

using Microsoft.Extensions.DependencyInjection;
using Plugins.Abstract;
using System;
using Volo.Abp.DependencyInjection;

namespace Plugins
{
    [Dependency(ServiceLifetime.Transient)]
    public class PluginService : IPluginService
    {
        public void Test()
        {
            Console.WriteLine("Hello PluginService");
        }
    }

    [Dependency(ServiceLifetime.Transient)]
    public class PluginService2 : IPluginService
    {
        public void Test()
        {
            Console.WriteLine("Hello PluginService2");
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

修改ConsoleHostedService

using Common;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Plugins.Abstract;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;

namespace AbpConsole01
{
    [Dependency(ServiceLifetime.Singleton)]
    public class ConsoleHostedService : IHostedService
    {
        public HelloWorldService HelloWorldService { get; set; }

        public CommonService CommonService { get; set; }

        public List<IPluginService> pluginServices { get; set; }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService启动");
            HelloWorldService.Test();
            CommonService.Test();
            if(pluginServices != null)
            {
                foreach (var item in pluginServices)
                {
                    item.Test();
                }
            }
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("ConsoleHostedService结束");
            return Task.CompletedTask;
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

重新生成Plugins项目,将dll复制到目录下
Autofac可以实现一个接口多个实现类的注册,但是我在实验过程中没有成功,后面解决了在填坑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/141337
推荐阅读
相关标签
  

闽ICP备14008679号