Appearance
构造注入
构造注入是指构造函数作为实例化的入口时,构造函数所需要的参数,会由容器自动注入,构造注入是 推荐 的注入方式 构造注入的优点是可以保证依赖的不可变(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