zoukankan      html  css  js  c++  java
  • AutoFac使用方法总结:Part II

    事件

    AutoFac支持三种事件:OnActivating,OnActivated,OnRelease。OnActivating在注册组件使用之 前会被调用,此时可以替换实现类或者进行一些其他的初始化工作,OnActivated在实例化之后会被调用,OnRelease在组件释放之后会被调 用。

     

       public class MyEvent : IDisposable
      {
          public MyEvent(string input)
          {
              Console.WriteLine(input);
          }
    
          public MyEvent()
          {
              Console.WriteLine("Init");
          }
    
          public void Dispose()
          {
              Console.WriteLine("Dispose");
          }
      }
       public void test_event()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<MyEvent>().
                OnActivating(e => e.ReplaceInstance(new MyEvent("input"))).
                OnActivated(e => Console.WriteLine("OnActivated")).
                OnRelease(e => Console.WriteLine("OnRelease"));
    
    
            using (IContainer container = builder.Build())
            {
                using (var myEvent = container.Resolve<MyEvent>())
                {
                }
            }
        }

    此时的输出为:

    Init
    input
    OnActivated
    Dispose
    OnRelease

    利用事件可以在构造对象之后调用对象的方法:

      [Fact]
        public void call_method_when_init()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<MyClassWithMethod>().OnActivating(e => e.Instance.Add(5));
            IContainer container = builder.Build();
            Assert.Equal(5, container.Resolve<MyClassWithMethod>().Index);
        }
      public class MyClassWithMethod
      {
          public int Index { get; set; }
          public void Add(int value)
          {
              Index = Index + value;
          }
      }

    循环依赖

    循环依赖是个比较头疼的问题,在AutoFac中很多循环依赖的场景不被支持:

       public class ClassA
      {
          private readonly ClassB b;
    
          public ClassA(ClassB b)
          {
              this.b = b;
          }
      }
    
      public class ClassB
      {
          public ClassA A { get; set; }
          
      }
     
     [Fact]
        public void circular_dependencies_exception()
        {
            var builder = new ContainerBuilder();
            builder.Register(c => new ClassB(){A = c.Resolve<ClassA>()});
            builder.Register(c => new ClassA(c.Resolve<ClassB>()));
            IContainer container = builder.Build();
            Assert.Throws(typeof(DependencyResolutionException), ()=>container.Resolve<ClassA>());
        }

    可以部分的解决这种循环依赖的问题,前提是ClassA和ClassB的生命周期不能都是InstancePerDependency

      [Fact]
        public void circular_dependencies_ok()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<ClassB>().
                PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).SingleInstance();
            builder.Register(c => new ClassA(c.Resolve<ClassB>()));
            IContainer container = builder.Build();
            Assert.NotNull(container.Resolve<ClassA>());
            Assert.NotNull(container.Resolve<ClassB>());
            Assert.NotNull(container.Resolve<ClassB>().A);
        }
  • 相关阅读:
    百度PaddlePaddle入门-14(多个CPU加速训练)
    Quantum Hierarchical State Machine (量子层级状态机)
    百度PaddlePaddle入门-13(网络优化)
    MachineLearning入门-9(数据准备)
    百度PaddlePaddle入门-12(损失函数)
    MachineLearning入门-8(数据可视化)
    百度PaddlePaddle入门-11(网络结构)
    页面生命周期
    JS控制开灯关灯
    JavaScript基础知识
  • 原文地址:https://www.cnblogs.com/wmlunge/p/2986735.html
Copyright © 2011-2022 走看看