【愚公系列】2022年02月 .NET架构班 002-ABP vNext在Console项目使用
【摘要】 前言ABP vNext在Console项目使用的两种方式:应用程序-主机服务主机服务-应用程序 方式一(应用程序-主机服务) 一、ABP vNext在Console项目使用 1.安装依赖包Volo.Abp.Core 二、模块类 1.创建模块类/// <summary>/// 使用ABP Module/// 好处/// 1、开发效率提升/// 2、维护量降低/// /// 总结:架构师一个条...
前言
ABP vNext在Console项目使用的两种方式:
- 应用程序-主机服务
- 主机服务-应用程序
方式一(应用程序-主机服务)
一、ABP vNext在Console项目使用
1.安装依赖包
Volo.Abp.Core
二、模块类
1.创建模块类
/// <summary>
/// 使用ABP Module
/// 好处
/// 1、开发效率提升
/// 2、维护量降低
///
/// 总结:架构师一个条件
/// 2个条件
/// 1、抽象(模块化思想)
/// 2、使用这种思想降低维护量,开发效率提升
///
/// </summary>
[DependsOn()]
class ConsoleModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 1、IOC注册自定义类
System.Console.WriteLine("加载ConsoleModule模块");
}
}
2.注册模块类
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("console......");
CreateHostBuilder(args).RunConsoleAsync().Wait();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseAutofac()
.ConfigureAppConfiguration((context, config) =>
{
//setup your additional configuration sources
})
.ConfigureServices((hostContext, services) =>
{
services.AddApplication<ConsoleModule>(options =>
{
});
});
}
三、服务类
1.创建服务类
HelloWorldService服务类
/// <summary>
/// 服务类
/// 1、接口注册》缺陷
/// </summary>
[Dependency(ServiceLifetime.Transient)]
public class HelloWorldService /*: ITransientDependency*/
{
public void SayHello()
{
System.Console.WriteLine("Hello World ABP");
}
}
ConsoleHostedService 主机服务类
/// <summary>
/// ConsoleHostedService主机服务
/// </summary>
public class ConsoleHostedService : IHostedService
{
//构造函数注入
public HelloWorldService _helloWorldService;
public ConsoleHostedService(HelloWorldService helloWorldService)
{
_helloWorldService = helloWorldService;
}
public Task StartAsync(CancellationToken cancellationToken)
{
//使用HelloWorldService服务
_helloWorldService.SayHello();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
2.注册服务类
[DependsOn()]
class ConsoleModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 1、IOC注册自定义类
System.Console.WriteLine("加载ConsoleModule模块");
//实现方式一
//context.Services.AddSingleton<HelloWorldService>();
//实现方式二
context.Services.AddHostedService<ConsoleHostedService>();
}
}
四、Autofac的配置
1.安装依赖包
Volo.Abp.Autofac
2.服务属性配置
Program配置
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("console......");
CreateHostBuilder(args).RunConsoleAsync().Wait();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseAutofac()//添加Autofac扩展
.ConfigureAppConfiguration((context, config) =>
{
//setup your additional configuration sources
})
.ConfigureServices((hostContext, services) =>
{
services.AddApplication<ConsoleModule>(options =>
{
});
});
}
ConsoleModule模块类配置
[DependsOn(typeof(AbpAutofacModule))]
class ConsoleModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 1、IOC注册自定义类
System.Console.WriteLine("加载ConsoleModule模块");
}
}
3.使用属性注入
ConsoleHostedService 主机服务类
/// <summary>
/// ConsoleHostedService主机服务
/// </summary>
public class ConsoleHostedService : IHostedService
{
//构造函数注入
public HelloWorldService _helloWorldService { set; get; }
public Task StartAsync(CancellationToken cancellationToken)
{
//使用HelloWorldService服务
_helloWorldService.SayHello();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
五、类库模块化使用方式
1.安装依赖包
控制台程序添加类库,并安装同样依赖包
Volo.Abp.Core
2.CommonModule模块类
public class CommonModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
System.Console.WriteLine("加载CommonModule模块");
}
}
3.CommonModule服务类
/// <summary>
/// 通用common服务
/// </summary>
[Dependency(ServiceLifetime.Transient)]
public class CommonService/* :ITransientDependency*/
{
public void Common()
{
System.Console.WriteLine("CommonService 执行");
}
}
4.模块类中引用Common类库模块
[DependsOn(typeof(AbpAutofacModule),typeof(CommonModule))]
class ConsoleModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
// 1、使用redis连接
// 2、使用rabbitmq
base.PreConfigureServices(context);
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 1、IOC注册自定义类
System.Console.WriteLine("加载ConsoleModule模块");
// context.Services.AddSingleton<HelloWorldService>();
context.Services.AddHostedService<ConsoleHostedService>();
}
public override void PostConfigureServices(ServiceConfigurationContext context)
{
// 1、去数据库加载数据到 本地缓存
// 2、加载分布式缓存数据 redis数据
base.PostConfigureServices(context);
}
}
注意引用的模块类会在ConsoleModule模块之前调用
5.模块类中引用Common类库的服务
/// <summary>
/// ConsoleHostedService主机服务
/// </summary>
public class ConsoleHostedService : IHostedService
{
/*private readonly HelloWorldService _helloWorldService;*/
public HelloWorldService _helloWorldService { set; get; }
public CommonService commonService { set; get; }// 属性注入
public Task StartAsync(CancellationToken cancellationToken)
{
//本地中的模块
_helloWorldService.SayHello();
//类库中的模块
commonService.Common();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
六、插件模块化使用方式
1.安装依赖包
控制台程序添加类库,并安装同样依赖包
Volo.Abp.Core
复制插件的Dll带相对应的文件夹
2.PluginModule模块类
/// <summary>
/// 插件模块
/// </summary>
public class PluginModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
System.Console.WriteLine("加载插件模块...........");
}
}
3.PluginModule服务类
/// <summary>
/// ABP 插件服务
/// </summary>
[Dependency(ServiceLifetime.Transient)]
public class PluginService : IPluginService
{
public void Plugin()
{
System.Console.WriteLine("插件服务");
}
}
/// <summary>
/// 插件接口
/// </summary>
public interface IPluginService
{
public void Plugin();
}
4.Program中安装Plugin插件
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("console......");
CreateHostBuilder(args).RunConsoleAsync().Wait();
}
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseAutofac()
.ConfigureAppConfiguration((context, config) =>
{
//setup your additional configuration sources
})
.ConfigureServices((hostContext, services) =>
{
services.AddApplication<ConsoleModule>(options =>
{
// 1、加载插件
options.PlugInSources.AddFolder(@"D:\\MyPlugIns");
});
});
}
5.模块类中引用Plugin插件的服务
/// <summary>
/// ConsoleHostedService主机服务
/// </summary>
public class ConsoleHostedService : IHostedService
{
/*private readonly HelloWorldService _helloWorldService;*/
public HelloWorldService _helloWorldService { set; get; }
public CommonService commonService { set; get; }// 属性注入
public List<IPluginService> _PluginService { set; get; } // 属性输入插件类
public Task StartAsync(CancellationToken cancellationToken)
{
_helloWorldService.SayHello();
commonService.Common();
foreach (var item in _PluginService )
{
_PluginService.Plugin();
}
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
方式二(主机服务-应用程序)
一、ABP vNext在Console项目使用
1.安装依赖包
Microsoft.Extensions.Hosting
Serilog.Extensions.Hosting
Serilog.Extensions.Logging
Serilog.Sinks.Async
Serilog.Sinks.Console
Serilog.Sinks.File
Volo.Abp.Autofac
二、主机服务类
1.主机创建服务类
MyConsoleAppHostedService
public class MyConsoleAppHostedService : IHostedService
{
private readonly IConfiguration _configuration;
private readonly IHostEnvironment _hostEnvironment;
public MyConsoleAppHostedService(IConfiguration configuration, IHostEnvironment hostEnvironment)
{
_configuration = configuration;
_hostEnvironment = hostEnvironment;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
//由服务类反向注册应用程序
return Task.CompletedTask;
}
public async Task StopAsync(CancellationToken cancellationToken)
{
await _abpApplication.ShutdownAsync();
}
}
2.注册服务类
public async static Task<int> Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)//日志层级
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))//写文件日志
.WriteTo.Async(c => c.Console())//日志输出到控制台
.CreateLogger();//创建日志
try
{
Log.Information("Starting console host.");
await Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
//扩展日志服务
services.AddHostedService<MyConsoleAppHostedService>();
})
.UseSerilog()
.RunConsoleAsync();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly!");
return 1;
}
finally
{
Log.CloseAndFlush();
}
}
三、模块类
1.创建模块类、服务类
模块类
[DependsOn(
typeof(AbpAutofacModule)
)]
public class MyConsoleAppModule : AbpModule
{
public override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
var logger = context.ServiceProvider.GetRequiredService<ILogger<MyConsoleAppModule>>();
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
logger.LogInformation($"MySettingName => {configuration["MySettingName"]}");
var hostEnvironment = context.ServiceProvider.GetRequiredService<IHostEnvironment>();
logger.LogInformation($"EnvironmentName => {hostEnvironment.EnvironmentName}");
return Task.CompletedTask;
}
}
服务类
public class HelloWorldService : ITransientDependency
{
public ILogger<HelloWorldService> Logger { get; set; }
public HelloWorldService()
{
Logger = NullLogger<HelloWorldService>.Instance;
}
public Task SayHelloAsync()
{
Logger.LogInformation("Hello World!");
return Task.CompletedTask;
}
}
2.注册模块类
public class MyConsoleAppHostedService : IHostedService
{
private IAbpApplicationWithInternalServiceProvider _abpApplication;
private readonly IConfiguration _configuration;
private readonly IHostEnvironment _hostEnvironment;
public MyConsoleAppHostedService(IConfiguration configuration, IHostEnvironment hostEnvironment)
{
_configuration = configuration;
_hostEnvironment = hostEnvironment;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
//创建ABP应用并注册模块类、服务类
_abpApplication = await AbpApplicationFactory.CreateAsync<MyConsoleAppModule>(options =>
{
//映射配置文件和主机环境
options.Services.ReplaceConfiguration(_configuration);
options.Services.AddSingleton(_hostEnvironment);
//使用Autofac
options.UseAutofac();
//使用Serilog
options.Services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog());
});
//初始化ABP应用
await _abpApplication.InitializeAsync();
//注册服务
var helloWorldService = _abpApplication.ServiceProvider.GetRequiredService<HelloWorldService>();
//
await helloWorldService.SayHelloAsync();
}
public async Task StopAsync(CancellationToken cancellationToken)
{
await _abpApplication.ShutdownAsync();
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)