鉴于:
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
我显然在这里遗漏了一些非常基本的东西 - 它是什么?
答案 0 :(得分:1)
您在生命周期范围内使用container
,因此您根本不使用它们。要解决组件使用lifetimeScope
:
using (var lifetimeScope = container.BeginLifetimeScope())
{
foobar1 = lifetimeScope.Resolve<FooBar>();
}
using (var lifetimeScope = container.BeginLifetimeScope())
{
foobar2 = lifetimeScope.Resolve<FooBar>();
}