文章出處

轉自逆心博客園

 

autofac 實例生命周期

  實例生命周期決定在同一個服務的每個請求的實例是如何共享的。

  當請求一個服務的時候,Autofac會返回一個單例 (single instance作用域), 一個新的對象 (per lifetime作用域) 或者在某種上下文環境中的單例。比如 一個線程 或者一個HTTP請求 (per lifetime 作用域)。

  這條規則適用于顯式調用Resolve從容器中檢索對象或者滿足依賴而隱式實現的對象。

  1、Per Dependency

  在其他容器中也稱作瞬態或者工廠,使用Per Dependency作用域,服務對于每次請求都會返回互補影響實例。

  在沒有指定其他參數的情況下,這是默認是作用域。

  builder.RegisterType<Worker>();
 
  // or
 
  builder.RegisterType<Worker>().InstancePerDependency();

  2、Single Instance

  使用Single Instance作用域,所有對父容器或者嵌套容器的請求都會返回同一個實例。

  builder.RegisterType<Worker>().SingleInstance();

  3、Per Lifetime Scope

  這個作用域適用于嵌套的生命周期。一個使用Per Lifetime 作用域的component在一個 nested lifetime scope內最多有一個實例。

  當對象特定于一個工作單元時,這個非常有用。比如,一個HTTP請求,每一個工作單元都會創建一個nested lifetime,如果在每一次HTTP請求中創建一個nested lifetime,那么其他使用 per-lifetime 的component在每次HTTP請求中只會擁有一個實例。

  這種配置模型在其他容器中等價于per-HTTP-request, per-thread等。

  builder.RegisterType<Worker>().InstancePerLifetimeScope();

  ASP.NET和WCF集成中,每一次web請求或者方法調用,InstancePerLifetimeScope會被默認附加到component上。

   4、上下文

  上下文作用域和per-lifetime作用域類似,但是對可見性提供更多顯示的控制。

  在大多數程序中,同一層次的容器嵌套代表一個工作單元,如果需要多層嵌套(例如global->request->transation),可以使用標簽確保component在多層結構中的某一層共享。

  builder.RegisterType<XWorker>().InstancePerMatchingLifetimeScope(MyContextHierarchy.UserSession);

  提供的標簽和生命周期作用域是對應的

  var userSessionLifetime = container.BeginLifetimeScope();
  userSessionLifetime.Tag = MyContextHierarchy.UserSession;

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


創作者介紹
創作者 IT工程師數位筆記本 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣( 35 )