天天看點

[翻譯]Autofac 解析服務

注冊元件以後,通過容器或 ILifetimeScope 的 Resolve 方法解析服務:

var builder = new ContainerBuilder();
builder.RegisterType<MyComponent>().As<IService>();
var container = builder.Build(); 

using(var scope = container.BeginLifetimeScope())
{
  var service = scope.Resolve<IService>();
}      

請注意,本例使用 ILifetimeScope 解析服務,而不是直接從容器解析。盡管可以從根容器直接解析元件,但是,某些情況下導緻記憶體洩露。建議始終從 ILifetimeScope對象解析元件,以確定服務的執行個體會被處置(Dispose)。請參考控制範圍和生命周期一節。

解析服務時,Autofac在服務的依賴層次中自動延伸,解析出構造服務對象需要的全部依賴項。如果遇到無法正确處理的循環依賴,或必需的依賴項找不到,将抛出 DependencyResolutionException。

對于不确定否已注冊的服務,可以用 ResolveOptional 方法或 TryResolve 方法嘗試條件解析。

// 若 IService 已注冊,則解析成功,否則,傳回 null。
var service = scope.ResolveOptional<IService>(); 

// 若IProvider 已注冊,則解析成功,否則,可以執行其他操作。
IProvider provider = null;
if(scope.TryResolve<IProvider>(out provider))
{
  // Do something with the resolved provider value.
}      

ResolveOptional() 和 TryResolve() 方法判斷特定的服務是否已注冊,如果服務已注冊,則嘗試解析。如果解析失敗(比如必需的依賴項未注冊),仍會抛出 DenpendencyResolutionException。

繼續閱讀