zoukankan      html  css  js  c++  java
  • 在.net core自带DI中服务生命周期 Transient,Scoped,Singleton

    只要是透过WebHost产生实例的类型,都可以在构造方法注入。所以Controller、View、Filter、Middleware或自定义的Service等都可以被注入。

    Transient是瞬时的。

    Scoped是一个实例的。

    Singleton是单例的。

    当在服务中注册一个 接口和类的对应关系 譬如(ISample ,Sample对应),按照以上3种生命周期对应

    我们给出类似如下的代码:

    控制器:

    namespace MyWebsite.Controllers
    {
        public class TestController : Controller
        {
            private readonly ISample _transient;
            private readonly ISample _scoped;
            private readonly ISample _singleton;
     
            public TestController(
                ISampleTransient transient,
                ISampleScoped scoped,
                ISampleSingleton singleton)
            {
                _transient = transient;
                _scoped = scoped;
                _singleton = singleton;
            }
     
            public IActionResult Index()
            {
                ViewBag.TransientId = _transient.Id;
                ViewBag.TransientHashCode = _transient.GetHashCode();
     
                ViewBag.ScopedId = _scoped.Id;
                ViewBag.ScopedHashCode = _scoped.GetHashCode();
     
                ViewBag.SingletonId = _singleton.Id;
                ViewBag.SingletonHashCode = _singleton.GetHashCode();
                return View();
            }
        }
    }

    视图:

    <table border="1">
        <tr><td colspan="3">Cotroller</td></tr>
        <tr><td>Lifetimes</td><td>Id</td><td>Hash Code</td></tr>
        <tr><td>Transient</td><td>@ViewBag.TransientId</td><td>@ViewBag.TransientHashCode</td></tr>
        <tr><td>Scoped</td><td>@ViewBag.ScopedId</td><td>@ViewBag.ScopedHashCode</td></tr>
        <tr><td>Singleton</td><td>@ViewBag.SingletonId</td><td>@ViewBag.SingletonHashCode</td></tr>
    </table>

    当用Transient的时候,他是瞬时的,在控制器中要为注入的接口创建一个Sample,控制器中用完就销毁了,然后进入View,又要创建一个新的,用完之后又销毁了。

    当用Scoped时,他是一次实例的,控制器中创建一个Sample用完之后并不销毁,接着传给View继续用。只要是在同一个Request中就不销毁,直到Request结束销毁,到下一个Request中重新创建一个实例。

    Singleton就是一次创建,无论多少个Request都使用第一次创建的那一个,即所谓单例模式。

  • 相关阅读:
    Qt 学习之路 2(84):Repeater
    MULE-ET0 、 ET1、ET2、PT1、PT2
    linux压缩和解压缩命令
    设置网卡
    打开虚拟机时显示不是有效的虚拟机配置文件是什么原因啊
    VMware设置NAT网络
    ubuntu 自动获取ip的怎么设置
    Qt 学习之路 2(84):Repeater
    Qt Quick里的图形效果:阴影(Drop Shadow)
    N皇后问题
  • 原文地址:https://www.cnblogs.com/wholeworld/p/9390540.html
Copyright © 2011-2022 走看看