AutoFac使用方法总结:Part III

来源:互联网 发布:淘宝运营做什么工作 编辑:程序博客网 时间:2024/05/29 19:24

生命周期

AutoFac中的生命周期概念非常重要,AutoFac也提供了强大的生命周期管理的能力。

AutoFac定义了三种生命周期:

Per DependencySingle InstancePer Lifetime Scope

Per Dependency为默认的生命周期,也被称为’transient’或’factory’,其实就是每次请求都创建一个新的对象

12345678910
  [Fact]    public void per_dependency()    {        var builder = new ContainerBuilder();        builder.RegisterType<MyClass>().InstancePerDependency();        IContainer container = builder.Build();        var myClass1 = container.Resolve<MyClass>();        var myClass2 = container.Resolve<MyClass>();        Assert.NotEqual(myClass1,myClass2);    }

Single Instance也很好理解,就是每次都用同一个对象

123456789101112
  [Fact]    public void single_instance()    {        var builder = new ContainerBuilder();        builder.RegisterType<MyClass>().SingleInstance();              IContainer container = builder.Build();        var myClass1 = container.Resolve<MyClass>();        var myClass2 = container.Resolve<MyClass>();              Assert.Equal(myClass1,myClass2);    }

Per Lifetime Scope,同一个Lifetime生成的对象是同一个实例

123456789101112131415161718
  [Fact]    public void per_lifetime_scope()    {        var builder = new ContainerBuilder();        builder.RegisterType<MyClass>().InstancePerLifetimeScope();              IContainer container = builder.Build();        var myClass1 = container.Resolve<MyClass>();        var myClass2 = container.Resolve<MyClass>();              ILifetimeScope inner = container.BeginLifetimeScope();        var myClass3 = inner.Resolve<MyClass>();        var myClass4 = inner.Resolve<MyClass>();              Assert.Equal(myClass1,myClass2);        Assert.NotEqual(myClass2,myClass3);        Assert.Equal(myClass3,myClass4);    }
12345678910111213141516
   [Fact]    public void life_time_and_dispose()    {        var builder = new ContainerBuilder();        builder.RegisterType<Disposable>();        using (IContainer container = builder.Build())        {            var outInstance = container.Resolve<Disposable>(new NamedParameter("name", "out"));            using(var inner = container.BeginLifetimeScope())            {                var inInstance = container.Resolve<Disposable>(new NamedParameter("name", "in"));            }//inInstance dispose here        }//out dispose here    }

转自:http://niuyi.github.io/blog/2012/04/06/autofact-by-unit-test3/

原创粉丝点击