2011-02-02 5 views
1

초보자에 대한 강력한 참고 자료입니다. 여기에 분명한 질문이 있으면 죄송합니다.Autofac 2

나는이 페이지에서 읽었습니다 : http://code.google.com/p/autofac/wiki/NewInV2 Autofac 1에서

은 약한 참조는 컨테이너에 의해 개최됩니다. 참조되는 객체가 GC/finalizer 리소스를 해제하기 위해 처분을 사용하지만 dispose 메소드에 응용 프로그램 논리가 포함되어 있으면 GC 타이밍이 예기치 않은 동작을 유발할 수 있습니다.

Autofac 2에는 일반적인 참조가 있습니다. 이 동작을 거부하고 수동으로 처분하려면 ExternallyOwned 등록 수정자를 사용하십시오.

내가 GC에 Autofac에 의해 해결되는 객체를 해제 할 필요가있을 때 그 의미인가, 나는 단순히 말할 수 없다 :

a = null; 

을 Autofac는 객체에 대한 강한 참조를 보유하고 있기 때문이다.

public class MyClass 
{ 
    public MyClass(Owned<A> a) 
    { 
     a.Value.Dosomething(); 
     a.Dispose(); 
    } 
} 

을하거나 ExternallyOwned 등록 수정 사용 : 대신에, 나는> <을 소유 사용해야한다

나중에
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).ExternallyOwned(); 

, 나는 GC에 개체를 해제하기 = NULL을 사용할 수 있어야합니다.

맞습니까?

감사합니다.

답변

3

기본적으로 아무 것도 처리 할 필요가 없습니다. 자동 가로 채우기 범위를 포함 할 때 작성한 IDisposable 인스턴스를 자동으로 식별하여 처리합니다.

개체의 수명을 수동으로 관리해야하는 경우 Owned<T> 또는 ExternallyOwned() 만 사용해야합니다. 당신이 Owned<T>를 해결하는 경우에 당신은 t.Dispose() 직접 호출해야합니다 - 일반적인 사용 패턴은 공장 대표에 대한 종속성을하는 것입니다

public class MyClass 
{ 
    private Func<Owned<User>> myDisposableFactory; 

    public MyClass(Func<Owned<User>> myDisposableFactory) 
    { 
     this.myDisposableFactory = myDisposableFactory; 
    } 

    public void DoSomething() 
    { 
     using (var disposable = this.myDisposableFactory()) 
     { 
      // ... 
      disposable.Dispose(); 
     } 
    } 
} 

ExternallyOwned() 다음 Autofac 어떤 해결 예를 때 처리하지 않습니다 당신이 유형을 등록하면 수명이 포함 된 범위가 끝납니다. 관리하는 것은 사용자가 결정합니다.

자세한 내용은 Nicholas Blumhardt's article on lifetimes을 참조하십시오.

+0

빠른 답장과 링크를 보내 주셔서 감사합니다! –