Autofac學習之三種生命周期:InstancePerLifetimeScope、SingleInstance、InstancePerDependency

来源:http://www.cnblogs.com/daryl/archive/2017/11/03/7778190.html
-Advertisement-
Play Games

InstancePerLifetimeScope:同一個Lifetime生成的對象是同一個實例 SingleInstance:單例模式,每次調用,都會使用同一個實例化的對象;每次都用同一個對象; InstancePerDependency:預設模式,每次調用,都會重新實例化對象;每次請求都創建一個新 ...


InstancePerLifetimeScope:同一個Lifetime生成的對象是同一個實例


SingleInstance:單例模式,每次調用,都會使用同一個實例化的對象;每次都用同一個對象;


InstancePerDependency:預設模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象;

 

驗證方法實現邏輯:在類的構造函數中,給屬性賦值(GUID),通過判斷屬性值是否一致來判斷 三種生命周期的效果。

 

先上圖看結果:

1、InstancePerLifetimeScope 

 

 

2、SingleInstance

 

 

3、InstancePerDependency

 

整塊代碼實現如下:

using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace SimpleAutofacConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            //IAnimal animal = new Tiger();
            //animal.Show("普通new()對象");

            var builder = new ContainerBuilder();
            var dependencyRegistrar = new DependencyRegistrar();//(IDependencyRegistrar)Activator.CreateInstance(typeof(IDependencyRegistrar));
            dependencyRegistrar.Register(builder, null);

            var container = builder.Build();

            var animalIOC = container.Resolve<IAnimal>();
            //animalIOC.Show("Autofac方式實現new()對象");
            Console.WriteLine(animalIOC.Id);

            var animalIOC2 = container.Resolve<IAnimal>();
            //animalIOC2.Show("第二次從容器中實例化");
            Console.WriteLine(animalIOC2.Id);

            Console.WriteLine("開啟新的生命周期");
            ILifetimeScope inner = container.BeginLifetimeScope();
            var myClass3 = inner.Resolve<IAnimal>();
            Console.WriteLine(myClass3.Id);
            var myClass4 = inner.Resolve<IAnimal>();
            Console.WriteLine(myClass4.Id);



            //var animalIOC = container.Resolve<Dog>();
            //animalIOC.Show("Autofac方式實現new()對象");



            Console.ReadLine();
        }
    }
    public interface IAnimal
    {
        void Show(string name);
        string Id { get; set; }
    }
    public class Tiger : IAnimal
    {
        private string _Id;
        public string Id { get { return this._Id; } set { Id = this._Id; } }
        public Tiger()
        {
            _Id = Guid.NewGuid().ToString();
        }

        public void Show(string name)
        {
            Console.WriteLine("老虎說:" + name);
        }
    }
    public class Dog : IAnimal
    {
        public string Id { get { return Guid.NewGuid().ToString(); } set { } }

        public void Show(string name)
        {
            Console.WriteLine("狗狗說:" + name);
        }
    }
    public class DependencyRegistrar : IDependencyRegistrar
    {
        public int Order { get { return 0; } }

        public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
        {
            // InstancePerLifetimeScope 同一個Lifetime生成的對象是同一個實例
            // SingleInstance 單例模式,每次調用,都會使用同一個實例化的對象;每次都用同一個對象
            // InstancePerDependency 預設模式,每次調用,都會重新實例化對象;每次請求都創建一個新的對象
            builder.RegisterType<Tiger>().As<IAnimal>().InstancePerLifetimeScope();
            //builder.RegisterType<Dog>().As<IAnimal>();//.PreserveExistingDefaults();
        }
    }

    public interface IDependencyRegistrar
    {
        void Register(ContainerBuilder builder,ITypeFinder typeFinder);

        int Order { get; }
    }


    public interface ITypeFinder
    {
        IList<Assembly> GetAssemblies();

        IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true);

        IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true);

        IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true);

        IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true);
    }
}

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨晚有教一個網友在ASP.NET MVC里,創建Web API和在MVC視圖中應用此API。 可以在ASP.NET MVC中,創建程式的model: namespace Insus.NET.Models { public class Weather { private int _Month; pub ...
  • 前面隨筆介紹了請假申請單和報銷申請單兩個不同的業務表單的流程處理,一個是單表信息,一個包含明細的主從表信息,後者包含了條件流程的處理,在流程審批中,一般還有一種流程處理就是會簽的操作,會簽處理是幾個審批步驟中審批人同時處理是否通過的,一般同時通過即為通過。本篇隨筆介紹工作流中的會簽處理過程。 ...
  • 從去年伊始,國內外一些大公司都先後推出了面向物聯網領域的平臺產品,如微軟 Azure 平臺的 IoT Hub、阿裡雲平臺的物聯網開發套件、百度雲平臺的物接入 IoT Hub、物解析 IoT Parser 和物管理 IoT Device 等等,但上述公司的產品從平臺特色和技術角度來看,相對比較適合一些 ...
  • 更多的演示 可以下載近乎源碼詳細查看體驗:www.jinhusns.com ...
  • 關於演示產品下載:www.jinhusns.com ...
  • 最近一直在搞各種編碼問題,略有心得,與大家分享一番。 System.Text提供了Encoding的抽象類,這個類提供字元串編碼的方法。常用的編碼方式主要有ASCII,Unicode,UTF8(Unicode編碼的一種)。 Unicode有四種編碼格式,UTF-8, UTF-16,UTF-32,UT ...
  • http://www.cnblogs.com/chenqf/p/6386163.html ...
  • Barrier類用於組織多個線程及時在某個時刻會面,其提供一個回調函數,每次線程調用了SignalAndWait方法後該回調函數就會被執行。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...