-1

예외가 발생하면 부모 또는 다른 사람에게 해결 방법을 전달 하시겠습니까?처분 될 때 컨테이너는 어떻게 행동해야합니까?

내가 가장 좋아하는 컨테이너 Autofac이 예외를 발생시킵니다. 이것이 내가 좋아하지 않는 유일한 것입니다. 나는


    class LazyClass 
    { 
     public void DoSomething() { } 
    } 

    class SomeClass 
    { 
     public event EventHandler WatchOut = (s, ea) => { }; 
     public void Start() 
     { 
      WatchOut(this, EventArgs.Empty); 
     } 
    } 

    class LazyInterceptor 
    { 
     Lazy<LazyClass> lazy; 
     public LazyInterceptor(Lazy<LazyClass> lazy) 
     { 
      this.lazy = lazy; 
     } 
     public void Register(SomeClass some) 
     { 
      some.WatchOut += (s, ea) => lazy.Value.DoSomething(); 
     } 
    } 

    [TestMethod] 
    public void LazyAndEvents() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<LazyClass>().SingleInstance(); 
     var container = builder.Build(); 

     var someClass = new SomeClass(); 

     using (var inner = container.BeginLifetimeScope(cb => 
      cb.RegisterType().SingleInstance())) 
     { 
      var interceptor = inner.Resolve(); 
      interceptor.Register(someClass); 
     } 

     someClass.Start(); 
    } 

내가이 주위를 세 가지 해결 방법을 알고이 코드 내 문제를 해결해야 그 부모 해상도를 통과해야한다고 생각하지만, 그들은 모두

  • 가 용기를 폐기 할뿐만 아니라 다르게 보일 - 이것은 내가 현재하고있는 일이지만, 그게 바로 오토 팩을 행복하게 만드는 것입니다.
  • 게으른 것을 명시 적으로 등록하는 것입니다. - 무엇이 해결 될지조차 모르겠습니다.
  • 처분에 대한 소유권을가집니다. m은 좋지 않지만 개체를 ​​그런 방식으로 사용하지 않으므로 다시 한번 해결 방법처럼 보입니다. 또한, Autofac에 평생 범위의 요점은 그게 수명 포함 된 인스턴스의을 제어하는 ​​
+0

안녕하세요 리카르드입니다. 첫 번째 해결책은 컨테이너를 처분하지 않고, 더 많은 정보없이 올바른 방법으로 들립니다. 인스턴스를 폐기하지 않으려면 왜 컨테이너를 처분해야합니까? 피터 (Peter)가 지적한 것처럼, 그것은 Container.Dispose()의 유일한 목적이다. 건배! –

+1

분명히 뭔가 잘못 된 것처럼 느껴집니다. 이 경우 범위를 모든 종속성을 수집하여 해결하고 동작을 설정하는 구성 지점으로 사용합니다. 이 시점에서 컨테이너는 그 목적을 달성했습니다. 의존성을 기반으로 그래프로부터 모든 인스턴스를 해결했습니다. 나는 그것을 더 이상 사용하지 않는다. 해당 인스턴스의 동작이 해당 수명에 종속되지 않도록하고 싶습니다. 그래서 나는 그것을 처분하지 않음으로써 범위를 유출하고있는 것처럼 느낍니다. 그리고 분명히 공장과 게으름은 범위 수명에 달려 있습니다. 결론 : 디자인이 잘못되었다고 생각합니다. –

+0

아마도 시나리오에 맞는 대체 구성 메커니즘이 필요할까요? 범위와 같은 소리는 잘못 사용하는 것이지만 일부 기능이 필요합니다. 구성 요소의 가시성을 제어하는 ​​무언가를 찾고 있습니까? 데이터를 가져 주셔서 감사합니다! –

답변

3

좋은하지 않습니다 의존성을 소개합니다. Disposable 패턴을 기반으로 컨테이너를 처분하는 것은 해당 컨테이너가 관리하는 자원을 해제하는 깔끔하고 잘 정립 된 방법입니다. 따라서 수명 범위가 삭제되면 해당 수명 범위에서 확인 된 인스턴스에 더 이상 의존해서는 안됩니다.

그래서 나는 틀린 방법으로 Autofac을 확실히 사용하고 있다고 말할 수 있습니다. 아마도 왜 그런 범위를 사용하고 싶은지 설명했다면 적절한 사용법을 알 수 있습니다.

+0

LazyClass가 루트 컨테이너에 있습니다. 평생 범위가 삭제되지 않습니다. LazyInterceptor의 수명 범위는 삭제되지만 중요하지 않습니다. –

+0

새로운 평생 범위에서 인터셉터를 해결하는 이유는 아직도 분명하지 않습니다. –

+0

자신의 범위에 있어야하기 때문에. 그것은 시스템의 분리 된 부분이며 다른 곳에서는 해석 할 수 없습니다. –