【Abp】Winform 如何使用Abp依赖注入
Winform 如何使用Abp
安装 Volo.Abp.Core
Install-Package Volo.Abp.Core -Version 4.4.4
创建模块和应用
// 创建模块(具体用途暂时不管)
// 一个继承自 AbpModule 的类
public class AppModule : AbpModule
{
}
// 使用 AbpApplicationFactory 创建一个应用
var app = AbpApplicationFactory.Create();
// 初始化应用
app.Initialize();
使用应用中的 ServiceProvider
获取服务从而实现依赖注入
初始化app之后,就可以使用app的依赖注入功能了,下面是默认的 Program.cs
internal static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
这里演示直接在第一个窗体实例化就换成从容器中获取,下面代码更改了form实例化的方式。但是暂时是不能够获取到服务的,因为IoC容器里暂时没有 Form1
, 所以无法替我们完成实例化。
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
// 使用 AbpApplicationFactory 创建一个应用
var app = AbpApplicationFactory.Create();
// 初始化应用
app.Initialize();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// var form = new Form1();
var form = app.ServiceProvider.GetService();
Application.Run(form);
}
把需要实例化的服务注册到IoC容器的方式
- 在
app.Initialize();
执行之前给app.Services
添加。(这里有AddSingleton()
AddTransient()
AddScoped()
) - 在
AppModule
内重写ConfigureService
方法,给context.Services
添加。(这里有AddSingleton()
AddTransient()
AddScoped()
) - 在具体的实现类里面加上特性
ITransientDependency
。(这里有ITransientDependency
IScopedDependency
ISingletonDependency
)
// 这里使用最简单的方式,添加一个接口标识
public partial class Form1 : Form, ISingletonDependency
{
public Form1()
{
InitializeComponent();
}
}
完成
其实不一定非要在入口程序修改Form的实例化方式,如果项目有历史包袱,不敢随意改动时,完全可以在新的功能模块里使用。这样改造之后,就可以使用Abp的一些好用的功能了。比如上面已经配置好的依赖注入。
这样改造之后,可以像在netcore写依赖注入一样,在Form的构造函数里面添加自己想要的服务,却根本不操心这个服务是怎么来的。
这里的Form1是通过Ioc容器完成实例化的,所以Form1所依赖的参数会一并实例化出来。当然,每一个参数都必须先注册到Ioc容器里面,才可以正常运行。
我试过本地化语言、缓存、Blob存储等是可以用的,更多的功能可以自己看官方文档尝试着用一下。
中文文档更新会稍微慢于英文文档。
中文:https://docs.abp.io/
英文:https://docs.abp.io/zh-Hans/abp/latest