2017-04-02 1 views
0

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가 만들 비쌀 수 있기 때문에, 저에 대한 나쁜 솔루션 인에 그렇게 작동 할 InstancePerDependencyMySingleton을 변경했다.

무엇이 여기에 있습니까?

+0

정상적인 동작입니다. 'MyScope'을'InstancePerMatchingLifetimeScope'의 "MyScope", "root"로 등록하십시오. * Autofac *는 먼저 "MyScope"인 첫 번째 일치하는 수명 측정기를 찾은 다음이 범위 내에 'MyScoped'인스턴스가 있는지 살펴 봅니다. 그렇지 않다면 새로운 것을 만들 것입니다. InstancePerMatchingLifetimeScope 선언에서 "MyScope"를 제거하면 예상대로 작동합니다. 당신이하려는 것을 우리에게 설명해 주시겠습니까? –

답변

0

단일 인스턴스로 등록 된 서비스는 루트 범위의 컨텍스트에서 해결 된 것으로 보입니다. Func<MyScoped>MySingleton에 삽입하면 항상 루트에서 MyScoped가 해결됩니다. 다음 코드는 : Do() 방법 var scopedObj = scoped();이없는 범위에서, 루트 컨테이너에서 MyScoped를 해결하기 때문

var singleton = container.Resolve<MySingleton>(); 
var s = container.Resolve<MyScoped>(); 

s.Num = 1; 

singleton.Do(); 

using (var scope = container.BeginLifetimeScope("MyScope")) 
{ 
    var scoped = scope.Resolve<MyScoped>(); 

    scoped.Num = 10; 

    singleton.Do(); 
} 

, 두 번 일을 인쇄 할 것이다.

수동으로 Do() 방법에 필요한 의존성을 전달하여 당신이 원하는 것을 얻을 수 : 그것은 각각 110를 인쇄 할

class MySingleton 
{ 
    public void Do(MyScoped myScoped) 
    { 
     Console.WriteLine(myScoped.Num); 
    } 
} 

// ... 

var singleton = container.Resolve<MySingleton>(); 
var s = container.Resolve<MyScoped>(); 

s.Num = 1; 

singleton.Do(s); 

using (var scope = container.BeginLifetimeScope("MyScope")) 
{ 
    var scoped = scope.Resolve<MyScoped>(); 

    scoped.Num = 10; 

    singleton.Do(scoped); 
} 

.

+0

불행히도, 이것은 좋은 해결책이 아닙니다. 그건 내가 전체 스택 아래 종속성을 커플 링해야합니다. – Elad

관련 문제