3

다른 DI 패턴을 연구합니다. 그리고 지금은 게으른 평생 구현에 관심이 있습니다. 예를 들어, 서비스 인터페이스 뒤에 팩토리를 숨기는 프록시 클래스를 작성하려고합니다. 기존의 IoC 컨테이너 (.NET) 중 어떤 것도 런타임에 이러한 종류의 프록시 클래스를 동적으로 만들 수 있습니까? 여기기존 IoC 컨테이너에서 지연 프록시 클래스를 동적으로 만들 수 있습니까?

interface IService 
{ 
    void Foo(); 
    void Bar(); 
} 

class ServiceFactoryProxy : IService 
{ 
    private readonly Func<IService> _factory; 

    public ServiceFactoryProxy(Func<IService> factory) 
    { 
     if (factory == null) throw new ArgumentNullException("factory"); 
     _factory = factory; 
    } 

    public void Foo() 
    { 
     _factory().Foo(); 
    } 

    public void Bar() 
    { 
     _factory().Foo(); 
    } 
} 

답변

1

유니티 상자에서이 작업을 수행합니다. 생성자에 Func<IService> 유형의 종속성을 선언하고 (예 : ServiceFactoryProxy) Unity에게 어떻게 IService을 해결해야하는지 알려줍니다. 컨테이너가 대리인을 생성합니다.


업데이트

그 프록시는 Lazy<T>의 캡슐처럼 보인다.

귀하의 의도는 this extension for Unity입니다.

Unity 3.0이 .NET4를 지원할 것이라는 것을 알기 때문에 다음 릴리스에서 Unity의 일부로 등장 할 것으로 예상됩니다.


갱신 2는

그것은 나에게 동안을했다하지만 난 게으른 프록시 기능을 마쳤다. 그것은이

public class MyContract_LazyInstantiationProxy : IMyContract 
{ 
    private readonly Lazy<IMyContract> instance; 
    public MyContract_LazyInstantiationProxy(Func<IMyContract> factory) 
    { 
    Guard.AssertNotNull(factory, "factory"); 
    this.instance = new Lazy<IMyContract>(factory); 
    } 
    public IMyContract Instance 
    { 
    get { return this.instance.Value; } 
    } 
    public string Foo(Bar bar) 
    { 
    return this.Instance.Foo(bar); 
    } 
} 

그래서 당신은 손으로 코딩 게으른 프록시의 성능을 얻을 수 있지만, 당신을 위해 동적으로 생성 될 것 같습니다 IL 코드를 생성합니다.

TecX project on codeplex을 살펴보십시오. 게으른 프록시 생성은 소스 코드 TecX.Unity.Proxies에서 찾을 수 있습니다. 그것을 사용하는 방법에 대한 샘플은 테스트 프로젝트 TecX.Unity.Proxies.Test에 있습니다.

+1

답장을 보내 주셔서 감사합니다.하지만 ServiceFactoryProxy 클래스의 동적 생성을 참조하고 있습니다 ... –

+0

@DmitriyStartsev 질문에 잘못이 있습니다. 어쩌면 업데이트가 원하는 것에 더 가깝습니다. –

+0

어쩌면 영어 실력이 부족하기 때문에 ... 미안해. 이 예에서 Lazy 은 새는 추상화의 예입니다. ILogger의 소비자는 초기화 (게으른 것인지 아닐지)에 대해 아무 것도 모른다. 대신 ILogger에 의존해야합니다. ILogger를 구체적으로 구현하면 프록시 클래스를 사용하여 로거를 지연 초기화 할 수 있습니다. 더 많은 것을 읽으십시오 http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx 제 질문은 런타임에이 프록시 클래스를 생성하는 방법이었습니다. –

관련 문제