2013-11-22 77 views
0

鑑於:基本autofac註冊/解析問題(InstancePerLifetimeScope)

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是不同的lifetimescope內解決,並註冊爲InstancePerLifetimeScope,我期待:

false 
false 
false 

但是我得到了:

true 
true 
true 

我很明顯錯過了這裏很基本的東西 - 它是什麼?

回答

1

您在生命週期範圍內使用container,因此您根本沒有使用它們。要解決組件使用lifetimeScope

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

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

是的,嗯;)謝謝。知道它必須是那樣的明顯。 –