Wenn Func<T>
ausgewertet wird, wo T mit InstancePerMatchingLifetimeScope
innerhalb einer Singleton-Klasse registriert ist, sollte es nicht dieselbe Instanz bereitstellen? das heißt, sollte nicht Func<T>
"Scope-aware" sein?Autofac Func <T> mit InstancePerMatchingLifetimeScope
Vielleicht wäre ein Beispiel besser.
Ich habe zwei Klasse:
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);
}
}
die wie folgt registriert werden:
var builder = new ContainerBuilder();
builder.RegisterType<MyScoped>().InstancePerMatchingLifetimeScope("MyScope", "root");
builder.RegisterType<MySingleton>().SingleInstance();
var container = builder.Build();
Und ich bin das folgende Stück Code ausgeführt wird:
var singleton = container.Resolve<MySingleton>();
singleton.Do();
using (var scope = container.BeginLifetimeScope("MyScope"))
{
var scoped = scope.Resolve<MyScoped>();
scoped.Num = 1;
singleton.Do();
}
Ich würde erwarten, dass der erste Anruf an Do()
würde 0 drucken, und die zweite drucken: 1.
Ich musste geändert MySingleton
zu InstancePerDependency
so würde es funktionieren, was eine schlechte Lösung für mich ist, weil MySingleton
teuer sein kann, zu schaffen.
Was fehlt mir hier?
Es ist das normale Verhalten. Sie registrieren 'MyScoped' mit' InstancePerMatchingLifetimeScope' von "MyScope" und dann "root". * Autofac * sucht zuerst nach dem ersten übereinstimmenden Lebensdau- erscope, der "MyScope" ist, und schaut dann nach, ob in diesem Bereich "MyScoped" vorhanden ist. Wenn nicht, wird ein neues erstellt. Wenn Sie "MyScope" in Ihrer 'InstancePerMatchingLifetimeScope'-Deklaration entfernen, funktioniert es wie erwartet. Kannst du uns erklären, was du versuchst? –