Skip to content

属性注入

属性注入是指通过当前类型的变量将相应的服务注入。属性注入的前提是当前属性必须被 [AutoAssemble] 标注,容器会自动根据当前属性的类型将相应实例注入。
属性注入的优点是属性使用方便,而且可以控制属性对外可写不可读,属性也可以有自己的逻辑

提示

  1. 属性的可以是任意访问级别,包括private
  2. 属性必须包含 set 方法
  3. 属性可以是static的属性,但static的属性只会在AsDIContext.Start()时赋值一次

基本用法

C#
[Service]
public class UserController
{
    [AutoAssemble]
    public IUserService Service
    {
        set; private get;
    }

    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
{
    [AutoAssemble(1)]
    public IUserService Service
    {
        set; private get;
    }

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

public interface IUserService
{
    string GetUserName();
}

[Service(1)]
public class UserService1 : IUserService
{
    public string GetUserName() => "Jack";
}

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

}

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

sh
> Hello Jack

非必须注入

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

C#
[Service]
public class UserController
{
    [AutoAssemble]
    public IUserService Service
    {
        set; private get;
    }

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

public interface IUserService
{
    string GetUserName();
}

报错如下:

C#
Unhandled exception. System.Exception: Property [Service] cannot be null

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

C#
[Service]
public class UserController
{
    [AutoAssemble(false)]
    public IUserService Service
    {
        set; private get;
    }

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

public interface IUserService
{
    string GetUserName();
}

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

sh
> Hello

沪ICP备2025119739号