依赖注入容器(.net core)

依赖注入容器这个是个好东西,写一篇记录一下,写下我的理解,有什么错误还望指正,当然不只.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文档

《依赖注入容器(.net core)》
大多是在这里添加服务注册(不在这里注册服务也不是不行啦)

services.AddScoped<ITestService,TestService>();
//指定将为每个作用域创建一个新的服务实例。在web中我理解是每一次请求就会实例化一次,也就是从访问开始直到访问结束

services.AddTransient<ITestService, TestService>();//指定每次请求时都会创建一个新的服务实例。也就是你每要一次就给你实例化一次

services.AddSingleton<ITestService, TestService>();//指定将创建一个服务的单个实例。从程序的开始到程序的结束,都只有这么一个实例,也就是只实例化一次

就拿下面这个个例子来说,当在注册的时候选择的是AddScoped或者AddTransient,我每一次页面刷新,都会重新实例化这个ITestService,所以每次我看test的值都是null

当然这两个是有区别的,前面说了,如果你是同一个请求中,在中间件之类的地方使用了Scoped不会再实例化
《依赖注入容器(.net core)》

如果我注册的是单例(AddSingleton),那么只会第一次时候才是null,第二次是hahah,因为是在同一个实例中,前面设置了值,除非你程序重新启动

《依赖注入容器(.net core)》

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怎么实现依赖注入容器好了….)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注