zoukankan      html  css  js  c++  java
  • AutoFac使用方法总结二:事件与依赖循环

         事件

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

     1   public class MyEvent : IDisposable
     2   {
     3       public MyEvent(string input)
     4       {
     5           Console.WriteLine(input);
     6       }
     7 
     8       public MyEvent()
     9       {
    10           Console.WriteLine("Init");
    11       }
    12 
    13       public void Dispose()
    14       {
    15           Console.WriteLine("Dispose");
    16       }
    17   }
     1    public void test_event()
     2     {
     3         var builder = new ContainerBuilder();
     4         builder.RegisterType<MyEvent>().
     5             OnActivating(e => e.ReplaceInstance(new MyEvent("input"))).
     6             OnActivated(e => Console.WriteLine("OnActivated")).
     7             OnRelease(e => Console.WriteLine("OnRelease"));
     8 
     9 
    10         using (IContainer container = builder.Build())
    11         {
    12             using (var myEvent = container.Resolve<MyEvent>())
    13             {
    14             }
    15         }
    16     }

         此时的输出为:

    1 Init
    2 input
    3 OnActivated
    4 Dispose
    5 OnRelease

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

     1     [Fact]
     2     public void call_method_when_init()
     3     {
     4         var builder = new ContainerBuilder();
     5         builder.RegisterType<MyClassWithMethod>().OnActivating(e => e.Instance.Add(5));
     6         IContainer container = builder.Build();
     7         Assert.Equal(5, container.Resolve<MyClassWithMethod>().Index);
     8     }
     9 
    10   public class MyClassWithMethod
    11   {
    12       public int Index { get; set; }
    13       public void Add(int value)
    14       {
    15           Index = Index + value;
    16       }
    17   }

         循环依赖

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

     1   public class ClassA
     2   {
     3       private readonly ClassB b;
     4 
     5       public ClassA(ClassB b)
     6       {
     7           this.b = b;
     8       }
     9   }
    10 
    11   public class ClassB
    12   {
    13       public ClassA A { get; set; }
    14       
    15   }
    16  
    17     [Fact]
    18     public void circular_dependencies_exception()
    19     {
    20         var builder = new ContainerBuilder();
    21         builder.Register(c => new ClassB(){A = c.Resolve<ClassA>()});
    22         builder.Register(c => new ClassA(c.Resolve<ClassB>()));
    23         IContainer container = builder.Build();
    24         Assert.Throws(typeof(DependencyResolutionException), ()=>container.Resolve<ClassA>());
    25     }

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

     1     [Fact]
     2     public void circular_dependencies_ok()
     3     {
     4         var builder = new ContainerBuilder();
     5         builder.RegisterType<ClassB>().
     6             PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies).SingleInstance();
     7         builder.Register(c => new ClassA(c.Resolve<ClassB>()));
     8         IContainer container = builder.Build();
     9         Assert.NotNull(container.Resolve<ClassA>());
    10         Assert.NotNull(container.Resolve<ClassB>());
    11         Assert.NotNull(container.Resolve<ClassB>().A);
    12     }

    转载链接:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test-2/

  • 相关阅读:
    在linux下使用sqlcmd
    sqlserver 索引的结构及其存储,索引内容
    据库被标记为RESTORING的处理方式,正在还原中,正在恢复
    sql语句的优化分析
    SQL Server表分区-水平分区
    JavaScript Structure
    JS----Issue
    JavaScript Book Plan
    LINQ
    About JavaScript
  • 原文地址:https://www.cnblogs.com/supersnowyao/p/8455053.html
Copyright © 2011-2022 走看看