2012-01-27 5 views
1

코드를 유연하게 구성하려고합니다. 따라서 내 응용 프로그램은 인터페이스를 많이 사용합니다. 내 컨트롤러 클래스에서보기의 특정 컨트롤에서 웹캠 미리보기를 시작하고 싶습니다. ClientView와 WebcamPreview의 구현은 서로 의존합니다. 따라서 WinForms 및 WPF 용으로 하나의 특정 WebcamPreview가 있습니다. 나는 2 개 가지 방법으로 종료 :UI 프레임 워크와 독립적으로 개발하기

옵션 1 :

장점 : 제네릭

단점 : 일반 선언 상단 컨트롤러 클래스까지 거품, 나는 그것을 적어도 3 개 제네릭을 선언해야 . (어쩌면 내가 뭔가 잘못하고 있어요?)

interface IClientView<TSelf> 
{ 
    TSelf SelfControl { get; } 
} 

interface IWebcamPreview<TSelf> 
{ 
    void Start(TSelf selfControl); 
} 

옵션 2 :

을 장점 : 많은 제네릭

단점을 피한다 : 지침; WPF 및 WinForms에 대해 다른 어셈블리를 컴파일합니다.

interface IClientView 
{ 
#if WPF 
    ControlBase SelfControl { get; } 
#else // WinForms 
    PictureBox SelfControl { get; } 
#endif 
} 

interface IWebcamPreview 
{ 
    // analog 
} 

다른 UI 프레임 워크를 지원하려면 어떻게해야합니까?

+0

귀하의 솔루션을 보여줌으로써 귀하는 원래의 문제로부터 조금 벗어났습니다. 나는 * 당신의'IWebcamPreview' 디자인이 더 나은 단어를 원한다면 조금 거꾸로 생각할 수도 있습니다. 이상적인 솔루션은 WPF 또는 Winforms인지 여부에 관계없이 다른 컨트롤에서 연결할 수있는 피드를 제공 할 것입니다. – perfectionist

+0

예제와 같이 : 저는 DirectShow를 사용하여 웹캠 이미지를 미리보고 캡처합니다. DirectShow에는 미리보기를 그릴 위치에 컨트롤의 핸들 (IntPtr)이 필요합니다. 그렇다면 어떻게 분리되어야 하는가? – Matthias

답변

2

옵션 3 :

abstract class AbstractControl { } 

class WinFormsControl : AbstractControl { } 

class WpfControl : AbstractControl { } 

interface IClientView 
{ 
    AbstractControl SelfControl { get; } 
} 
+0

PictureBox 및 WPF와 같은 사용자 지정 컨트롤을 전달해야합니다. 그럼이게 효과가 없거나 뭔가 놓칠까요? – Matthias

+0

이것은 콘트리트 클래스가 콘트롤을 반환 할 수 있거나 콘트롤로 변환 할 수있는 어댑터를 제공하면 쉽게 작동합니다. 아이디어는 클래스 구조와 관련하여 다른 옵션이 있다는 것을 보여주기위한 것입니다. –

+0

그래서'WinFormsControl'과'WPFControl'는 원래 컨트롤의 컨테이너 (?)일까요? – Matthias

1

옵션 1 길을 가야하는 것입니다. 옵션 2는 지시문을 매우 빠르게 사용하므로 매우 빠르게 처리됩니다. 언젠가 WPF 및 Winform 외에도 Windows Phone 및 웹 응용 프로그램에서해야 할 일이 있다면 새로운 #elif 지시문을 추가하기 위해 많은 코드를 사용해야합니다. 코드는 그 시점에서보기에는 너무 즐겁지 않을 것입니다. 옵션 1과 좋은 조직 즉, WPF가 1 개의 어셈블리로 들어가면 Windows Phone과 같은 다른 Winform과 같은 추가 기능이 기존 코드의 재 컴파일을 필요로하지 않을 수도 있습니다. 만약 그렇다면, 아마 아주 최소한 일 것입니다.

+0

그러면 많은 제네릭이 거품을 일게하는 것은 피할 수없는 일이라고 주장하겠습니까? – Matthias

관련 문제