Skip to content

构造注入

构造注入是指构造函数作为实例化的入口时,构造函数所需要的参数,会由容器自动注入,构造注入是 推荐 的注入方式 构造注入的优点是可以保证依赖的不可变(readonly),而且可以防止循环依赖

基本用法

C#
[Service]
public class UserController
{

    private readonly IUserService service;

    public UserController(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 readonly IUserService service;

    public UserController([AutoAssemble(1)] IUserService service)
    {
        this.service = service;
    }

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

}

public interface IUserService
{
    string GetUserName();
}

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

[Service(2)]
public class UserService2 : IUserService
{
    public string GetUserName()
    {
        return "Lily";
    }
}

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

sh
> Hello Jack

非必须注入

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

C#
[Service]
public class UserController
{

    private readonly IUserService service;

    public UserController(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 readonly IUserService service;

    public UserController([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号