當你完成組件註冊,並將組件暴露為適當的服務後你就可以通過容器或者容器的子生命周期域來解析服務(After you have your components registered with appropriate services exposed, you can resolve services f ...
當你完成組件註冊,並將組件暴露為適當的服務後你就可以通過容器或者容器的子生命周期域來解析服務(After you have your components registered with appropriate services exposed, you can resolve services from the built container and child lifetime scopes)。你可以通過Resolve()方法來解析服務。
var builder = new ContainerBuilder(); builder.RegisterType<MyComponent>.As<IService>(); var container = builder.Build(); using(var scope = container.BeginLifetimeScope()) {
var service = scope.Resolve<IService>(); }
你可能已經註意到例子中是通過容器的子生命周期域對服務進行解析而不是直接使用容器(container)來接服務的——你也應該以這樣的方式來解析服務。
雖然也可以直接使用容器(container)來解析服務,但如果你這樣做可能導致應用程式記憶體泄漏。所以建議你總是儘可能的在自生命周期域中解析服務,這樣autofac能夠幫助你妥善的處理對象銷毀以及垃圾回收工作。你將在今後的章節中瞭解到更詳細的內容。
解析服務時,autofac將自動的連接服務的整個依賴層次,並且自動構件服務所需要的依賴項。當你的程式中存在迴圈依賴項或者依賴項缺失,那麼程式將會拋出DependencyResolutionException異常。
假設你有一個服務,但不能確定它是否已經註冊到容器當中,你可以嘗試使用ResolveOptional() 或者TryResolve()方法進行條件解析:
//如果已經註冊了IService服務,那麼它將被正確的解析, //如果沒有對IService服務進行註冊,那麼該方法將返回null var service = scope.ResolveOptional<IService>(); //如果IProvider進行了註冊,那麼provider將獲得對象, //如果IProvider沒有註冊,那麼你可以進行其他操作 IProvider provider = null if(scope.TryResolve<IProvider>(out provider)) { //服務被成功解析 }
3.1、為解析傳遞參數(Passing Parameters to Resolve)
明天繼續...
PS:本系列博客是對autofac英文資料的翻譯,主要目的是為了提高自己英文閱讀能力,同時能夠幫助有需要的人,原文地址http://autofac.readthedocs.org/en/latest/getting-started/index.html。