基本autofac注册/解决问题(InstancePerLifetimeScope)

时间:2013-11-22 22:47:48

标签: c# autofac

鉴于:

public class Foo { };
public class Bar {
    public Foo Foo { get; set; }
    public Bar(Foo foo)
    {
        Foo = foo;
    }
};

public class FooBar
{
    public Bar Bar { get; set; }

    public FooBar(Bar bar)
    {
        Bar = bar;
    }
}

以下代码:

        var builder = new ContainerBuilder();

        builder.RegisterType<Foo>().InstancePerLifetimeScope();
        builder.RegisterType<Bar>().InstancePerLifetimeScope();
        builder.RegisterType<FooBar>().InstancePerLifetimeScope();

        var container = builder.Build();

        FooBar foobar1;
        FooBar foobar2;

        using (container.BeginLifetimeScope())
        {
            foobar1 = container.Resolve<FooBar>();

        }

        using (container.BeginLifetimeScope())
        {
            foobar2 = container.Resolve<FooBar>();

        }

        Console.WriteLine(object.ReferenceEquals(foobar1, foobar2));
        Console.WriteLine(object.ReferenceEquals(foobar1.Bar, foobar2.Bar));
        Console.WriteLine(object.ReferenceEquals(foobar1.Bar.Foo, foobar2.Bar.Foo));

由于foobar1和foobar2在不同的生命周期内被解析并注册为InstancePerLifetimeScope,我希望:

false
false
false

但是我得到了:

true
true
true

我显然在这里遗漏了一些非常基本的东西 - 它是什么?

1 个答案:

答案 0 :(得分:1)

您在生命周期范围内使用container,因此您根本不使用它们。要解决组件使用lifetimeScope

using (var lifetimeScope = container.BeginLifetimeScope())
{
    foobar1 = lifetimeScope.Resolve<FooBar>();
}

using (var lifetimeScope = container.BeginLifetimeScope())
{
    foobar2 = lifetimeScope.Resolve<FooBar>();
}
相关问题