zoukankan      html  css  js  c++  java
  • [翻译]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。

  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/dongbeifeng/p/5300716.html
Copyright © 2011-2022 走看看