Đầu tiên, cần tải xuống các thư viện Nuget sau: Volo.Abp.Core và Volo.Abp.Autofac.
Project Structure (Cấu trúc dự án)
Bạn cần thêm mã nguồn vào file Program.cs:
using MyConsoleApp;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Volo.Abp.Modularity.PlugIns;
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
// Thêm các nguồn cấu hình bổ sung của bạn ở đây
})
.UseAutofac()
.ConfigureServices((hostContext, services) =>
{
services.AddApplication<ConsoleModule>(options =>
{
// 1. Tải các plugin từ thư mục
options.PlugInSources.AddFolder(@"D:\DuAn\MyPlugin");
});
});
CreateHostBuilder(args).RunConsoleAsync().Wait();
ConsoleHostedService (Dịch vụ Console được托管)
using MyConsoleApp;
using MyConsoleApp.Interfaces;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;
namespace MyConsoleApp
{
public class ConsoleHostedService : IHostedService
{
// Inject phụ thuộc vào các thuộc tính
public HelloWorldService _helloWorldService { get; set; }
public CommonService CommonService { get; set; }
public IPluginService PluginService { get; set; }
public async Task StartAsync(CancellationToken cancellationToken)
{
_helloWorldService.HelloWorld();
CommonService.Show();
PluginService.Plugin();
return Task.CompletedTask;
}
public async Task StopAsync(CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
}
ConsoleModule (Module Console)
using MyConsoleApp;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
namespace MyConsoleApp
{
[DependsOn(typeof(AbpAutofacModule), typeof(CommonModule))]
public class ConsoleModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Console.WriteLine("Module Console được tải");
context.Services.AddHostedService<ConsoleHostedService>();
}
}
}
HelloWorldService (Dịch vụ HelloWorld)
using Volo.Abp.DependencyInjection;
namespace MyConsoleApp
{
[Dependency(ServiceLifetime.Transient)]
public class HelloWorldService
{
public void HelloWorld()
{
Console.WriteLine("Xin chào Thế giới");
}
}
}
CommonModule và CommonService (Module và Dịch vụ Chung)
CommonModule:
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace MyConsoleApp.Common
{
public class CommonModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Console.WriteLine("Module Chung được tải");
}
}
}
CommonService:
using Volo.Abp.DependencyInjection;
namespace MyConsoleApp.Common
{
[Dependency(ServiceLifetime.Scoped)]
public class CommonService
{
public void Show()
{
Console.WriteLine("Tôi là dịch vụ Chung");
}
}
}
PluginService và Plugin (Dịch vụ Plug-in và Plug-in)
PluginService:
using MyConsoleApp.Interfaces;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
namespace MyConsoleApp.Plugin
{
[Dependency(ServiceLifetime.Transient)]
public class PluginService : IPluginService
{
public void Plugin()
{
Console.WriteLine("Tôi là plug-in");
}
}
}
Plugin:
using Volo.Abp.Modularity;
namespace MyConsoleApp.Plugin
{
public class Plugin : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Console.WriteLine("Plug-in được tải");
}
}
}
Các điểm cần lưu ý:
- Thuộc tính [DependsOn] chỉ định các module phụ thuộc.
- Thuộc tính [Dependency] chỉ định vòng đời của dịch vụ.
- Phải sử dụng autofac để đảm bảo注入 phụ thuộc đúng cách.
- Phải đặt Autofac ở vị trí đầu tiên trong các phụ thuộc của module.
- Tên lớp implement interface phải tuân thủ quy tắc đặt tên (bỏ chữ I).
- Không được tham chiếu trực tiếp đến plugin từ module chính, phải tham chiếu qua interface.
Trên đây là cách cấu trúc một ứng dụng Console .NET Core sử dụng ABP Framework và Autofac.