2012-11-29 2 views
5

두 명의 다른 고객이 사용하는 Visual Studio 2010에 C# WinForms 응용 프로그램이 있습니다. 응용 프로그램의 기본 기능은 각 고객마다 동일하지만 특정 코드 행 (저장 프로 시저, 자원, 특정 동작 이름)은 버전마다 다릅니다. 지금까지 동일한 프로젝트에 응용 프로그램을 보관하고 구축/게시 할 때 전 처리기 지시문을 사용하여 사용할 배포간에 전환했습니다. 그러나 프로젝트의 범위는 더 이상 실현 될 수없는 시점까지 커졌습니다.두 버전의 응용 프로그램을 동시에 유지 관리 및 배포

코드의 상당 부분이 공유되어 있으므로 소스 코드 파일 복제를 피하려고합니다. 다른 버전을 동시에 배포해야하는 응용 프로그램을 유지하는 것이 가장 좋은 방법인지 궁금합니다.

+0

전 처리기 지시문을 분기 처리에 사용하면 안됩니다. –

+0

동의. 이것은 외부 고객이 관심을 표명 한 작은 사내 어플리케이션으로 시작되었으므로 분리를위한 빠른 솔루션이 필요했습니다. – WickerPopstar

답변

4

인터페이스를 사용하여 클래스를 정의하십시오. 인터페이스가 있으면 동일한 인터페이스를 클라이언트마다 하나씩 여러 구현할 수 있음을 의미합니다. 이를 위해서는 기존 코드베이스를 분석하고 코드에서 이러한 인터페이스를 정의 할 수있는 논리적 인 구분을 식별해야합니다.

그러면 클라이언트를 기반으로 필요에 따라 인터페이스를로드 할 수 있습니다. 예를 들어 구성을 통해이 작업을 수행 할 수 있습니다. 구성 값에 따라 Implementation1 또는 Implementation2를로드합니다. 이 특정 비트를 달성하는 많은 방법이 많이 있습니다. 의존성 주입, 제어 반전, Ninject, Autofac, Unity 같은 도구를 살펴 봐야합니다.

사전 처리기 지시문을 사용한 방법을 고려할 때 실제로는 어려울 수 있지만 응용 프로그램이 어떻게 커지는지를 보면이 리팩토링이 필요합니다. 지금하지 않으면이 리펙토링이 나중에 애플리케이션이 복잡 해짐에 따라 훨씬 비쌉니다.

+0

나는 건축 문제 였고, 용어 (의존성 주입, IOC 등)에 감사드립니다. 그것들은 내가 해결책을 찾을 때 빠졌던 용어들이었다. – WickerPopstar

2

다른 기능은 응용 프로그램 아키텍처의 일부 여야합니다. 다른 고객에게 다른 기능이 필요한 경우이를 추상화하여 비헤이비어를 감싸는 인터페이스를 만든 다음 두 개의 다른 어셈블리에서 두 가지 방식으로 구현하십시오. 그런 다음 (귀하의 배포 메커니즘에 따라), 당신은 하나의 DLL 또는 다른 응용 프로그램을 제공 할 수 있습니다. 재 컴파일, 참조 추가 등을 피하기 위해 Ninject, Castle Windsor, MEF 등의 Dependency Injection 프레임 워크를 사용할 수 있습니다. 코드가 충분히 다르면 "플러그인과 유사한"아키텍처입니다.

텍스트, 색상, 기본 차이점에 대해 이야기하는 경우 하드 코딩되지 않고 데이터 중심이어야합니다. 응용 프로그램이 인터넷에 연결되어 있으면 사용자가 로그인 할 때 적절한 설정을 다운로드 할 수 있습니다. 그렇지 않으면 텍스트/색상/동작이 고객 별 설정 파일에 들어갈 수 있음을 나타냅니다. 구성 변환을 사용하여 해당 프로세스를 단순화 할 수 있습니다.

+0

기본 차이점은 이미 데이터 중심이며 다행히도 마찬가지입니다. 주로 기능입니다. 이러한 프레임 워크에 익숙하지 않지만이 응용 프로그램은 ClickOnce 배포를 사용합니다. 그러면 이러한 프레임 워크가 구현되는 방식이 변경됩니까? – WickerPopstar

+0

나는 내 프로젝트에서 똑같은 상황에 처해있다. Ninject와 다른 DI 프레임 워크가 작동하지만 앱을 설치 한 후 URL에서 DLL을 동적으로 다운로드합니다. 그렇지 않으면 모든 고객이 다른 모든 고객의 논리가 포함 된 DLL을 설치합니다. 디스크가 아닌 URL에서 어셈블리를로드하려는 경우 많이 변경되지 않습니다. 또는 어쨌든 디스크에서 할 수있는 작업 :) –

0

일부 리소스, 구성 또는 속성 파일을 사용하여 차이점을 구분할 수 있습니다. 이를 통해 특정 상황에서 사용할 저장 프로 시저의 이름과 같은 파일에 일종의 값을 저장한다는 의미입니다. 그런 다음 코드가 파일에서 이름을 읽고 실행합니다. 각 배포에 대한 코드를 다시 작성하지 않고도 파일의 값을 변경할 수 있습니다.

관련 문제