AutoFac使用方法总结:Part II

来源:互联网 发布:php培训课程安排 编辑:程序博客网 时间:2023/11/29 03:17

事件

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>())            {            }        }    }


此时的输出为:

InitinputOnActivatedDisposeOnRelease


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

[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);    }


 

原创粉丝点击