T가 InstancePerMatchingLifetimeScope
으로 등록 된 Func<T>
을 평가할 때, 단일 클래스 내에서 동일한 인스턴스를 제공하지 않아야합니까? 즉, Func<T>
은 "범위 인식"이 아니어야합니까?Autofac Func <T> with InstancePerMatchingLifetimeScope
예를 들어 더 좋을 수도 있습니다.
var builder = new ContainerBuilder();
builder.RegisterType<MyScoped>().InstancePerMatchingLifetimeScope("MyScope", "root");
builder.RegisterType<MySingleton>().SingleInstance();
var container = builder.Build();
그리고 난 다음 코드 조각을 실행하고 있습니다 : 다음과 같이 등록
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 singleton = container.Resolve<MySingleton>();
singleton.Do();
using (var scope = container.BeginLifetimeScope("MyScope"))
{
var scoped = scope.Resolve<MyScoped>();
scoped.Num = 1;
singleton.Do();
}
내가 기대
나는이 수업이 Do()
에 대한 첫 번째 호출은 0을 인쇄하고 두 번째 호출은 0 1.
를 인쇄 할 것이다 나는 MySingleton
가 만들 비쌀 수 있기 때문에, 저에 대한 나쁜 솔루션 인에 그렇게 작동 할 InstancePerDependency
에 MySingleton
을 변경했다.
무엇이 여기에 있습니까?
정상적인 동작입니다. 'MyScope'을'InstancePerMatchingLifetimeScope'의 "MyScope", "root"로 등록하십시오. * Autofac *는 먼저 "MyScope"인 첫 번째 일치하는 수명 측정기를 찾은 다음이 범위 내에 'MyScoped'인스턴스가 있는지 살펴 봅니다. 그렇지 않다면 새로운 것을 만들 것입니다. InstancePerMatchingLifetimeScope 선언에서 "MyScope"를 제거하면 예상대로 작동합니다. 당신이하려는 것을 우리에게 설명해 주시겠습니까? –