在评估Func<T>
其中T是在InstancePerMatchingLifetimeScope
中注册的,在单例类中,它不应该提供相同的实例吗?也就是说,不应该Func<T>
是“范围感知”?Autofac Func <T> with InstancePerMatchingLifetimeScope
也许一个例子会更好。
我有两个类:
class MyScoped
{
public int Num { get; set; }
}
class MySingleton
{
readonly Func<MyScoped> scoped;
public MySingleton(Func<MyScoped> scoped)
{
this.scoped = scoped;
}
public void Do()
{
var scopedObj = scoped();
Console.WriteLine(scopedObj.Num);
}
}
哪些是注册这样的:
var builder = new ContainerBuilder();
builder.RegisterType<MyScoped>().InstancePerMatchingLifetimeScope("MyScope", "root");
builder.RegisterType<MySingleton>().SingleInstance();
var container = builder.Build();
而且我运行下面的代码:
var singleton = container.Resolve<MySingleton>();
singleton.Do();
using (var scope = container.BeginLifetimeScope("MyScope"))
{
var scoped = scope.Resolve<MyScoped>();
scoped.Num = 1;
singleton.Do();
}
我期望第一次拨打Do()
将打印0,第二次打印将打印1.
我不得不改变MySingleton
到InstancePerDependency
所以它会工作,这对我来说是一个坏的解决方案,因为MySingleton
可以创建昂贵。
我在这里错过了什么?
这是正常的行为。您使用“MyScope”的InstancePerMatchingLifetimeScope和“root”注册“MyScoped”。 * Autofac *将首先查找第一个匹配的生命周期“MyScope”,然后查看该范围内是否有任何“MyScoped”实例。如果不是,它会创建一个新的。如果您在“InstancePerMatchingLifetimeScope”声明中删除“MyScope”,它将按预期工作。你能向我们解释你想做什么吗? –