2011년 10월 31일 월요일

Castle.Windsor 를 이용한 Decorator 패턴

Castle.Windsor 는 IoC/DI 라이브러리 중에 .NET 계열에서는 유명하고, 많이 사용하는 라이브러리 중에 한가지입니다. NHibernate 초기에 DynamicProxy 를 Castle.DynamicProxy 를 사용하여, 많이 유명해졌지요.
지금은 NHibernate도 독립적으로 ProxyFactory를 운용하고, Microsoft 사까지 Unity 라는 IoC/DI 라이브러리를 제공하고 있어, 어떤 것이 더 좋냐? 이런 건 무의미하고, 각자 자신에게 맞는 걸 사용하면 되겠습니다.



 

  
   
    ${DataService.Northwind}
    ${RequestSerializer.Northwind}
    ${ResponseSerializer.Northwind}
   
  

  
   
    ${DataService.Pubs}
    ${RequestSerializer.Pubs}
    ${ResponseSerializer.Pubs}
   
  
  
  

  
   
    ${AdoRepository.Northwind}
   
  

  
   
    ${AdoRepository.Pubs}
   
  

  
  

  
   
    ${JsonSerializer.Request}
    ${Compressor.SharpBZip2}
   
  

  
   
    ${JsonSerializer.Response}
    ${Compressor.SharpBZip2}
   
  

  
   
    ${RequestSerializer.Compress}
    ${Encryptor.Aria}
   
  

  
   
    ${ResponseSerializer.Compress}
    ${Encryptor.Aria}
   
  


  
   
    ${BsonSerializer.Request}
    ${Compressor.SevenZip}
   
  

  
   
    ${BsonSerializer.Response}
    ${Compressor.SevenZip}
   
  
  
  

  
  

  
  

  
  

  
  
  
  
  

  
  

 
 

위의 코드는 Castle.Windsor 를 이용하여, Dependency Injection을 좀 복잡하게 사용한 예입니다. 뭐 이렇게 할 필요가 있나 싶겠지만, 제품을 만들다 보면, Customizing을 해야 할 게 아니라, 위와 같이 Configuration을 변경하도록 하는 것이 제품 완성도를 높인다고 믿고 있는 터라 꼭 이런 방식을 사용합니다.

아니 이런 Decorator 패턴에 대해 쓴다는 걸 서론만 쓰고, 그만 뒀네요... 코드 처리하는데 정신이 팔려서리... 쩝...
자 그럼 코드를 좀 볼까요? 상위에 있는 놈들은 모두 Component의 속성이나 인자값으로 다른 Component 를 주입하는 Dependency Injection이라 합니다.

자 여기서 Decorator 패턴을 사용한 예는?
Component 중에 "RequestSerializer.Pubs" 를 보십시요. 이 놈은 Serializer 로 "RequestSerializer.Compress" 를 Wrapping 하여 ARIA 암호화를 수행하는 Decorator 입니다.
"RequestSerializer.Compress" 는 "BsonSerializer.Request" 를 Wrapping 하고, SevenZip 알고리즘으로 압축을 수행합니다.
자 이제 정리하면 BSON->Compress->암호화 로 래핑되도록 되었습니다. 물론 순서는 바꿀 수 있고, Decorator를 더 추가할 수도 있습니다.

이렇게 환경설정에서 IoC/DI 기능 중에 Decorator 패턴을 활용하게 되면, 상당히 복잡한 구성도 쉽게 구성할 수 있고, 다양한 조합의 Component를 제공할 수 있습니다.

댓글 없음: