實例生命周期決定在同一個服務的每個請求的實例是如何共用的。 當請求一個服務的時候,Autofac會返回一個單例 (single instance作用域), 一個新的對象 (per lifetime作用域) 或者在某種上下文環境中的單例。比如 一個線程 或者一個HTTP請求 (per lifetime ...
實例生命周期決定在同一個服務的每個請求的實例是如何共用的。
當請求一個服務的時候,Autofac會返回一個單例 (single instance作用域), 一個新的對象 (per lifetime作用域) 或者在某種上下文環境中的單例。比如 一個線程 或者一個HTTP請求 (per lifetime 作用域)。
這條規則適用於顯式調用Resolve從容器中檢索對象或者滿足依賴而隱式實現的對象。
準備工作:
public class Person { public string Name { get; set; } public int Age { get; set; } public void Self() { Console.WriteLine("我叫{0}, 今年{1}歲了!", this.Name, this.Age); } }
開始了:
1、Per Dependency
在其他容器中也稱作瞬態或者工廠,使用Per Dependency作用域,服務對於每次請求都會返回新的實例.
在沒有指定其他參數的情況下,這是預設是作用域。
var builder = new ContainerBuilder(); builder.Register(c => new Person() { Name = "Elvin" }).InstancePerDependency(); var container = builder.Build(); var person1 = container.Resolve<Person>(); person1.Name = "person1"; var person2 = container.Resolve<Person>(); person2.Name = "person2"; person1.Self(); person2.Self();
2、Single Instance
使用Single Instance作用域,所有對父容器或者嵌套容器的請求都會返回同一個實例。
這裡將 InstancePerDependency 直接替換成 SingleInstance 就行了, 其他代碼是一樣的. 直接看結果:
3、Per Lifetime Scope
每一個lifetime內, 生成的對象都是同一個實例.
這個作用域適用於嵌套的生命周期。一個使用Per Lifetime 作用域的component在一個 nested lifetime scope內最多有一個實例。
當對象特定於一個工作單元時,這個非常有用。比如,一個HTTP請求,每一個工作單元都會創建一個nested lifetime,如果在每一次HTTP請求中創建一個nested lifetime,那麼其他使用 per-lifetime 的component在每次HTTP請求中只會擁有一個實例。
這種配置模型在其他容器中等價於per-HTTP-request, per-thread等。
var builder = new ContainerBuilder(); builder.Register(c => new Person() { Name = "Elvin" }).InstancePerLifetimeScope(); var container = builder.Build(); var person1 = container.Resolve<Person>(); person1.Name = "person1"; var person2 = container.Resolve<Person>(); person2.Name = "person2"; var inner = container.BeginLifetimeScope(); var person3 = container.Resolve<Person>(); person3.Name = "person3"; var person4= container.Resolve<Person>(); person4.Name = "person4"; person1.Self(); person2.Self(); person3.Self(); person4.Self();
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;
參考: