Skip to content

方法注入

方法注入是指通过当前类型的方法将相应的服务注入。方法注入的前提是当前方法必须被 [AutoAssemble] 标注,容器会自动根据当前方法所需要的参数类型将相应实例注入。
方法注入的优点是可以同时注入多个参数,也可以通过多个方法注入不同的参数,同时,方法还可以有自身的逻辑处理

提示

  1. 方法的可以是任意访问级别,包括private
  2. 方法可以是static的方法,但static的方法只会在AsDIContext.Start()时执行一次

基本用法

C#
[Service]
public class UserController
{
    private IUserService service;

    [AutoAssemble]
    protected void SetParameters(IUserService service)
    {
        this.service = service;
    }

    public void Print()
    {
        Console.WriteLine("Hello " + service?.GetUserName());
    }

}

public interface IUserService
{
    string GetUserName();
}

[Service]
public class UserService : IUserService
{
    public string GetUserName()
    {
        return "Jack";
    }
}

此时,调用UserController的Print方法时,会输出:

sh
> Hello Jack

注入对应版本

C#
[Service]
public class UserController
{

    private IUserService service;

    [AutoAssemble]
    private void SetParameter([AutoAssemble(1)] IUserService user1, [AutoAssemble(2)] IUserService user2)
    {
        string str = "ac";
        if (user1.Like(str))
        {
            service = user1;
        }
        if (user2.Like(str))
        {
            service = user2;
        }

    }

    public void Print()
    {
        Console.WriteLine("Hello " + service?.UserName);
    }

}

public interface IUserService
{
    bool Like(string subStr);

    string UserName { get; }
}

[Service(1)]
public class UserService : IUserService
{
    public bool Like(string subStr)
    {
        return "Jack".Contains(subStr);
    }

    public string UserName => "Jack";
}

[Service(2)]
public class UserService2 : IUserService
{
    public bool Like(string subStr)
    {
        return "Lily".Contains(subStr);
    }

    public string UserName => "Lily";

}

此时,调用UserController的Print方法时,会输出:

sh
> Hello Jack

非必须注入

如果注入时,容器无法实例化相应的类型,在注入时会报错。

C#
[Service]
public class UserController
{
    private IUserService service;

    [AutoAssemble]
    protected void SetParameters(IUserService service)
    {
        this.service = service;
    }

    public void Print()
    {
        Console.WriteLine("Hello " + service?.GetUserName());
    }

}

public interface IUserService
{
    string GetUserName();
}

报错如下:

C#
Unhandled exception. System.Exception: Parameter [service] cannot be null

如果希望注入时,非必须注入,可以标注[AutoAssemble(false)]

C#
[Service]
public class UserController
{
    private IUserService service;

    [AutoAssemble]
    protected void SetParameters([AutoAssemble(false)] IUserService service)
    {
        this.service = service;
    }

    public void Print()
    {
        Console.WriteLine("Hello " + service?.GetUserName());
    }

}

public interface IUserService
{
    string GetUserName();
}

此时,调用UserController的Print方法时,会输出:

sh
> Hello

沪ICP备2025119739号