依赖注入容器这个是个好东西,写一篇记录一下,写下我的理解,有什么错误还望指正,当然不只.netcore有这个依赖注入容器,看到后面就知道了...
依赖注入容器,我觉得可以分成三个东西来讲,一个是依赖一个是注入,然后就是容器
其实你可能已经用过这个东西了,只是你不知道原来这就叫依赖注入,就拿.netcore来说
我定义了一个index的方法,需要一个传入的TestModel和一个参数test
但是你1没有实例化TestModel,2没有给test赋值,但是你却可以直接的使用它们,这就是依赖注入带给你的好处,你只管使用,不要管是怎么来的,非常方便
public IActionResult Index(TestModel testModel,string test)
{
testModel.test="test";
TryValidateModel(testModel);
return View();
}
//TestModel
public class TestModel
{
[StringLength(10, MinimumLength = 1, ErrorMessage = "内容长度不正确")]
[Required(ErrorMessage = "请输入内容")]
public string test;
}
依赖
说简单就是你需要的东西,你执行的代码需要去调用另外的一块的代码,你需要靠另外一段代码(值)才能执行,另外一段代码(值)就是你依赖的东西,就像前面的例子一样,Index方法依赖TestModel这个类,和test这个值
注入
直接贴没有注入的情况下的代码
public IActionResult Index()
{
TestModel testModel=new TestModel();
string test=Request.Query["test"];
testModel.test="test";
TryValidateModel(testModel);
return View();
}
需要自己动手的实例化,和获取值,看着都不是很方便
吧依赖项交给你的调用者来创建,然后再丢给你直接使用就是注入
依赖注入容器
吧三个东西加起来就是依赖注入容器了????我倒要看看这容器里面装的什么药
依赖注入容器中的容器主要是做:
* 绑定服务与实例之间的关系
* 存放管理实例
也不知道怎么说,拿代码说话吧
绑定服务与实例之间的关系,有3中不同的生命周期的创建方式
AddScoped/Transient/Singleton文档
services.AddScoped<ITestService,TestService>();
//指定将为每个作用域创建一个新的服务实例。在web中我理解是每一次请求就会实例化一次,也就是从访问开始直到访问结束
services.AddTransient<ITestService, TestService>();//指定每次请求时都会创建一个新的服务实例。也就是你每要一次就给你实例化一次
services.AddSingleton<ITestService, TestService>();//指定将创建一个服务的单个实例。从程序的开始到程序的结束,都只有这么一个实例,也就是只实例化一次
就拿下面这个个例子来说,当在注册的时候选择的是AddScoped或者AddTransient,我每一次页面刷新,都会重新实例化这个ITestService,所以每次我看test的值都是null
当然这两个是有区别的,前面说了,如果你是同一个请求中,在中间件之类的地方使用了Scoped不会再实例化
如果我注册的是单例(AddSingleton),那么只会第一次时候才是null,第二次是hahah,因为是在同一个实例中,前面设置了值,除非你程序重新启动
public HomeController(ITestService testService)
{
testService.setTestString("hahah");
}
TestService
public class TestService:ITestService
{
public string test;
public string getTestString()
{
return test;
}
public void setTestString(string test)
{
this.test = test;
}
}
ITestService
public interface ITestService
{
string getTestString();
void setTestString(string test);
}
用PHP实现了一个依赖注入容器,学习了laravel的写的:(用PHP实现了一个依赖注入容器,学习了laravel的写的:https://github.com/huanl-php/container
(这篇文章不是讲的.netcore吗?????我到底是干什么的....下一次写一下php怎么实现依赖注入容器好了....)
文章评论