【Abp笔记】依赖注入()

Abp 依赖注入

官方文档

https://docs.abp.io/zh-Hans/abp/latest/Dependency-Injection

基本使用

直接注册

context.Services.AddTransient<IGreetService, GreetService>();

实现接口(就是一个标记)

ITransientDependency

打Dependency特性

[Dependency(ServiceLifetime.Transient)]

// 如果已经有注册过,可以改ReplaceServices为true,从而替换掉原有的
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]

当实现的接口特别多,程序报错了,可能会用到

[ExposeService(typeof(接口))]

控制台使用Autofac属性注入

  • 在使用工厂创建AbpApplication的时候,调用options的UseAutofac方法

这里是一个winform项目的示例

public static class Program
{ 
    [STAThread]
    static void Main()
    {
        var app = AbpApplicationFactory.Create<MyModule>(options =>
        {
            options.UseAutofac();
        });

        app.Initialize();

        ApplicationConfiguration.Initialize();
        
        // 获取Form类型实例必须在 Winform的ApplicationConfiguration.Initialize();方法之后,不然会报错。
        // 哪怕是通过new创建一个Form对象,也要放到其后面

        var form = app.ServiceProvider.GetService<Form1>();
        Application.Run(form);
    }
}

接口和实现,并打上自动注册的标识

public interface IGreetService
{
    string Hello(string name);
}

public class GreetService : IGreetService,ITransientDependency
{
    public string Hello(string name)
    {
        return $"你好,{name}";
    }
}

添加了这个之后,就可以在任何通过ServiceProder构造出来的对象内,添加属性的方式注入自己需要的服务,比如

public partial class Form1 : Form 
{
    // 直接加个属性,就可以了。
    public IGreetService GreetService { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var str = GreetService.Hello(txtName.Text);
        MessageBox.Show(str);
    }
}    public partial class Form1 : Form 
{
    public IGreetService GreetService { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var str = GreetService.Hello(txtName.Text);
        MessageBox.Show(str);
    }
}
————————

Abp 依赖注入

官方文档

https://docs.abp.io/zh-Hans/abp/latest/Dependency-Injection

基本使用

直接注册

context.Services.AddTransient<IGreetService, GreetService>();

实现接口(就是一个标记)

ITransientDependency

打Dependency特性

[Dependency(ServiceLifetime.Transient)]

// 如果已经有注册过,可以改ReplaceServices为true,从而替换掉原有的
[Dependency(ServiceLifetime.Transient, ReplaceServices = true)]

当实现的接口特别多,程序报错了,可能会用到

[ExposeService(typeof(接口))]

控制台使用Autofac属性注入

  • 在使用工厂创建AbpApplication的时候,调用options的UseAutofac方法

这里是一个winform项目的示例

public static class Program
{ 
    [STAThread]
    static void Main()
    {
        var app = AbpApplicationFactory.Create<MyModule>(options =>
        {
            options.UseAutofac();
        });

        app.Initialize();

        ApplicationConfiguration.Initialize();
        
        // 获取Form类型实例必须在 Winform的ApplicationConfiguration.Initialize();方法之后,不然会报错。
        // 哪怕是通过new创建一个Form对象,也要放到其后面

        var form = app.ServiceProvider.GetService<Form1>();
        Application.Run(form);
    }
}

接口和实现,并打上自动注册的标识

public interface IGreetService
{
    string Hello(string name);
}

public class GreetService : IGreetService,ITransientDependency
{
    public string Hello(string name)
    {
        return $"你好,{name}";
    }
}

添加了这个之后,就可以在任何通过ServiceProder构造出来的对象内,添加属性的方式注入自己需要的服务,比如

public partial class Form1 : Form 
{
    // 直接加个属性,就可以了。
    public IGreetService GreetService { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var str = GreetService.Hello(txtName.Text);
        MessageBox.Show(str);
    }
}    public partial class Form1 : Form 
{
    public IGreetService GreetService { get; set; }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var str = GreetService.Hello(txtName.Text);
        MessageBox.Show(str);
    }
}