그러나 COM 만 사용하려는 경우 이러한 종류의 디자인으로 볼 수없는 이점이 있습니까?
이 질문 스 니펫은 여기에서 디자인 결정 의 가장 중요한 부분이며, 그 대답은 항상 그렇습니다 .
COM Interop을 통해서만 라이브러리를 사용하려는 경우이를 염두에두고 전체 시스템을 설계해야합니다. 줄 수를 세 배로 늘릴 이유가 없습니다. 시스템에 LoC가 많을수록 더 많은 결함이 발생합니다. 따라서 COM 호환 기능 만 사용하도록 시스템을 설계해야합니다.
그러나 .Net 라이브러리의 사용을 COM으로 제한 해야하는 좋은 이유는 생각할 수 없습니다. 다른 .Net 코드에서 어셈블리를 사용하고 싶지 않은 이유는 무엇 입니까? 이런 식으로 자신을 제한하는 것은 거의 의미가 없습니다.
이에 대한 경험이 있으므로 처리 방법을 알려 드리겠습니다. 확실히 이상적이지 않습니다. 나는 약간의 절충안을 만들었습니다. 최신 .Net 관용구와 호환되지 않는 COM 클래스 (실제로 인터페이스)의 외관 만 사용합니다. 그렇지 않으면 .Net 인터페이스를 COM에 직접 노출시킵니다. 이것은 기본적으로 제네릭을 사용하는 모든 인터페이스에 파사드를 사용한다는 것을 의미합니다. 내가 만난 것은 제네릭 뿐이며 단순히 호환되지 않습니다. 불행히도, 이것은을 반환하는 모든 것에 대한 정면을 의미하며 IEnumerable<T>
, 이는 매우 일반적입니다.
그러나 파사드 클래스는 .Net 클래스에서 상속하고 특정 Interop 인터페이스를 구현하기 때문에 이것은 거의 나쁘지 않습니다. 이 같은.
namespace Company.Product.Feature
{
public class MyClass : INetInterface
{
// lots of code
}
}
namespace Company.Product.Interop
{
public class MyClass : Feature.MyClass, IComInterface
{
// over ride only the incompatible properties/methods
}
}
이렇게하면 중복 코드가 최소한으로 유지되고 COM 인터페이스가 "의도하지 않은"변경으로부터 보호됩니다. 코어 클래스 / 인터페이스가 변경됨에 따라 어댑터 클래스는 더 많은 메소드를 능가해야합니다 (또는 인터페이스를 중단하고 주요 버전 번호를 충돌시킵니다). 반면, 모든 Interop 코드가 Interop
네임 스페이스에 저장되는 것은 아니며 파일 구성이 혼동 될 수 있습니다. 내가 말했듯이, 그것은 트레이드 오프입니다.
이에 대한 전체 예를 보려면 내 repo 의 SourceControl 및 Interop 폴더를 찾아 볼 수 있습니다 . ISourceControlProvider
그리고 GitProvider
특히 관심이 될 것입니다.