2011-05-09 9 views
2

나는 저장소에서 ID를 찾아서 서로를 참조하는 POCO 개체를 가지고 있습니다. 리포지토리에는 개체를 제거 할 수있는 캐시 정책이 있으므로 개체간에 강력한 참조가 필요하지 않습니다. 그것들을 참조하는 다른 객체는 단지 저장소를 통해 다시로드해야합니다. IoC 컨테이너로 AutoFac을 사용하고 있습니다.약한 레퍼런스 대 Autofac 레졸루션?

아주 간단한 예 - 통화 객체에 대한 지역의 객체 참조 : 나는 두 가지 방법으로 실험 한

class Region 
{ 
    ... 
    public Currency GetCurrency() 
    { 
     ... Get the right Currency object 
    } 
    ... 
} 

이 작업을 수행합니다. 첫 번째는 Find (id)를 호출 할 수 있도록 AutoFac에 매번 통화 저장소를 확인하도록 요청하는 것입니다.

두 번째는 WeakReference입니다. 여기서 .IsAlive를 사용하여 .Target을 반환 할 수 있는지 확인하거나 저장소를 확인하고 찾기를 호출하고 내가 가지고있는 것에 대해 약한 참조를해야하는지 확인합니다.

나는 WeakReference가 부과 한 작은 오버 헤드를 연구했지만 매번 해결할 AutoFac을 묻는 것과 비교할 때 확실하지 않습니다.

생각하십니까?

편집 : 리포지토리가 .find에 응답해야하는 시간과 노력을 감안할 때 - 나는 오버 헤드 또는 자동 공격 해결로 WeakReference가 더 비쌉니다.

답변

4

난 그냥 더 오버 헤드 인 궁금하네요.

두 가지가 완전히 다른 것을하기 때문에 대답하기가 어렵습니다. 오버 헤드는 또한 autofac으로 구성 요소를 등록/해결하는 방법에 상당히 의존합니다.

예를 들면 다음과 같습니다. InstancePerLifetimeScope()로 등록하고 Lazy?

weakreference를 사용하면 객체에 대한 참조를 보유하고 있지만 런타임에서 수집하는 것이 좋다고 말하면 처리 할 수 ​​있습니다.

autofac을 사용하면 컨테이너에 인스턴스를 만들고 제공하고, 종속성을 주입하고, 수명주기 범위 및 폐기를 (가능하게) 관리하도록 요청합니다.

오버 헤드 -이 두 가지 관심사가 교차하는 (무언가의 인스턴스를 얻는) 작은 영역은 완전히 구성 요소를 등록하고 해결하는 방법에 따라 다르지만, WeakReference가 ' 약간 (아주 약간) 적은 오버 헤드가 있습니다. WR은 런타임 오버 헤드가 약간 더 많기 때문에 직접 비교하기는 어렵습니다.

+1

다른 말로하면 문제가되지 않지만 두 옵션을 모두 사용해보고 결과를 비교하는 것이 좋습니다. –

2

데이터베이스에가는 것은 항상 weakreference를 처리하는 것보다 훨씬 오버 헤드가 많을 것입니다. 이 특정 화폐 예제의 경우, 소수의 개체 만 있으므로 전체를 메모리에 보관하여 가장 잘 처리 할 수 ​​있지만 큰 데이터 집합의 경우 2 계층 접근 방식 (weakreference + repository)이 합리적인 것처럼 보입니다. WeakReference를하거나 저장소에 대한 반복 IOC의 해상도 -

+0

로버트에게 감사하지만, 분명히하기 위해 저장소는 찾기에 대답하기 위해 DB로 갈 필요조차 없습니다. 더 많은 오버 헤드가 무엇인지 궁금 할뿐입니다. 저장소에 대한 WeakReference 또는 반복 된 IoC 해상도. – n8wrl