• 在.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都使用第一次创建的那一个,即所谓单例模式。

  • 相关阅读:
    java——阶段性整理(方法的重载重写和一些关键字)
    设计模式——单例模式
    source
    set和setenv
    c++编译加执行脚本
    python脚本小记
    转义字符
    istream_iterator/ostream_iterator
    字符串替换程序 p324
    程序编译后运行时的内存分配
  • 原文地址:https://www.cnblogs.com/wholeworld/p/9390540.html
Copyright © 2020-2023  润新知