Appearance
属性注入
属性注入是指通过当前类型的变量将相应的服务注入。属性注入的前提是当前属性必须被 [AutoAssemble] 标注,容器会自动根据当前属性的类型将相应实例注入。
属性注入的优点是属性使用方便,而且可以控制属性对外可写不可读,属性也可以有自己的逻辑
提示
- 属性的可以是任意访问级别,包括private
- 属性必须包含 set 方法
- 属性可以是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