Appearance
方法注入
方法注入是指通过当前类型的方法将相应的服务注入。方法注入的前提是当前方法必须被 [AutoAssemble] 标注,容器会自动根据当前方法所需要的参数类型将相应实例注入。
方法注入的优点是可以同时注入多个参数,也可以通过多个方法注入不同的参数,同时,方法还可以有自身的逻辑处理
提示
- 方法的可以是任意访问级别,包括private
- 方法可以是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