【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容器的方式

  1. app.Initialize(); 执行之前给 app.Services 添加。(这里有 AddSingleton() AddTransient() AddScoped())
  2. AppModule 内重写 ConfigureService 方法,给 context.Services 添加。(这里有 AddSingleton() AddTransient() AddScoped())
  3. 在具体的实现类里面加上特性 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