C# 3.0에서 데스크톱 애플리케이션을 어떻게 설계하시겠습니까?

StackOverflow https://stackoverflow.com/questions/45705

  •  09-06-2019
  •  | 
  •  

문제

저는 C#, wpf 및 .Net 3.5를 배우기 위해 C# 3.0에서 간단한 데스크톱 응용 프로그램을 만들었습니다.내 응용 프로그램은 기본적으로 csv 파일에서 데이터를 읽고 이를 SQL Server CE 데이터베이스에 저장합니다.저는 sqlmetal을 사용하여 데이터베이스에 대한 ORM 코드를 생성합니다.이 앱의 첫 번째 버전은 정말 보기 흉하고 리팩토링하는 중입니다.

내 질문이 생깁니다.C#으로 데스크톱 데이터베이스 앱을 어떻게 설계하시겠습니까?모범 사례는 무엇입니까?

sqlmetal 생성 코드를 사용하는 DAL(데이터베이스 추상화 계층)을 생성합니까?아니면 생성된 코드가 추상화에 충분합니까?

DAL 패턴을 사용하는 경우 싱글톤으로 만드나요, 아니면 정적 멤버로 만드나요?DAL 패턴과 함께 View-Model-ModelView 패턴을 사용합니까?

이것이 긴 개방형 질문처럼 보인다면 사과드립니다. 하지만 저는 최근에 이에 대해 많은 생각을 해왔습니다.C#으로 엔터프라이즈 n 계층 앱을 설계하는 방법에 대한 많은 예를 볼 수 있지만 독립 실행형 데스크톱 앱을 설계하는 방법에 대해서는 그다지 많지 않습니다.

도움이 되었습니까?

해결책

나는 다음과 같이 시작할 것이다. WPF에 대한 복합 애플리케이션 지침 (기침 프리즘 기침) Microsoft의 P&P 팀에서 제공합니다.다운로드하면 오늘날 대부분의 WPF 개발의 출발점이 되는 훌륭한 참조 응용 프로그램이 제공됩니다.

그만큼 DotNetRocks 승무원 방금 인터뷰했어요 글렌 블록 그리고 브라이언 노이스 그들로부터 더 많은 이야기를 듣고 싶다면 이에 대해 알아보세요.

더 좋은 점은 WinForms 시절부터 Prism에 익숙하다면 Prism은 CAB만큼 무겁지 않다는 것입니다.

다른 팁

대답은 언제나 그렇듯이 "상황에 따라 다르다"입니다.

고려해야 할 몇 가지 사항:어느 시점에서는 이 팻 클라이언트 앱을 웹 앱으로 만들고 싶을 수도 있습니다.그렇다면 비즈니스 계층(및 그 이하)과 프레젠테이션을 분리해야 합니다.이를 수행하는 가장 간단한 방법은 비즈니스 로직에 대한 모든 호출이 일종의 인터페이스를 통과하는지 확인하는 것입니다.더 복잡한 방법은 전체 MVC 설정을 구현하는 것입니다.

고려할 수 있는 또 다른 사항은 데이터 액세스 계층을 비즈니스 논리 및 사용자 인터페이스와 독립적으로 만드는 것입니다.이는 비즈니스 논리에서 DAL로의 모든 호출이 "SQL에서 이 데이터 가져오기" 또는 더 나쁜 "이 SQL 문 실행"이 아니라 일반적인 "이 데이터 가져오기"여야 함을 의미합니다.이러한 방식으로 DAL을 다른 데이터베이스, XML 파일 또는 심지어 플랫 파일과 같은 이상한 것에 액세스하는 DAL로 바꿀 수 있습니다.

간단히 말해서, 관심사의 분리입니다.이를 통해 다른 UI를 추가하거나 세 영역을 모두 자체 계층으로 분할하거나 관련 기술을 변경하여 향후 성장할 수 있습니다.

무엇이든 설계하기 전에 앱에 대한 요구 사항을 정의해야 합니다.
이는 초보 개발자가 흔히 저지르는 실수입니다. 코드가 어떻게 수행될지 생각하기 전에 코드 작성을 시작하는 것입니다.내 조언은 응용 프로그램의 일부 기능을 설명하는 것입니다.어떻게 구현해야 하는지 느끼는 데 도움이 될 것입니다.

유용한 학습 자료에 관해서는 다음을 살펴보는 것이 좋습니다. 복합WPF 개발자에게 데스크톱 앱 개발 모범 사례를 가르치기 위해 특별히 고안된 프로젝트입니다.

저는 제레미 밀러의 이야기부터 시작하겠습니다. 나만의 운전실 만들기 시리즈.

저는 CAB의 얼리 어답터였습니다.저는 해당 기술을 자세히 알아보고 애플리케이션 아키텍처에 대한 모든 .NET 블로그를 읽으면서 많은 것을 배웠습니다.

하지만 최근에 새 프로젝트를 시작할 기회가 있었고 CAB를 사용하는 대신 StructureMap과 NHibernate를 사용하여 Jeremy가 사용하는 패턴 중 일부(특히 이벤트 집계를 처리하는 방식)를 빌렸습니다.그 결과 제가 필요한 모든 것을 수행하는 매우 단순화된 수작업 프레임워크가 탄생했고 저는 그 프레임워크로 작업하는 것을 좋아합니다.

귀하의 질문에 대한 구체적인 내용은 다음과 같습니다.데이터 액세스를 위해 저장소를 사용합니다.처음에는 ADO.NET 코드를 작성하고 데이터 판독기를 사용하여 개체를 매핑했습니다.하지만 그건 정말 빨리 낡아버렸기 때문에 NHibernate를 구입했고 정말 기뻤습니다.리포지토리는 데이터 액세스를 위해 NHibernate를 사용하며 이 특정 앱에서는 내 데이터 액세스 요구 사항이 매우 간단합니다.

리포지토리를 활용하는 서비스 계층(WCF, 이중 채널을 통해 노출됨)이 있습니다.내 앱은 기본적으로 실시간 업데이트가 가능한 클라이언트-서버입니다(귀하의 질문이 단지 클라이언트에 관한 것이라는 것을 알고 있지만 저는 동일한 기술과 패턴을 사용하겠습니다).영형

클라이언트 측에서는 IoC용 StructureMap과 클래스 간 통신을 위한 매우 간단한 이벤트 집계 전략이 포함된 MVP를 활용합니다.나는 거의 모든 것에 대한 인터페이스를 코딩합니다.내가 한 유일한 다른 작업은 뷰를 동적으로 표시하기 위한 유연한 "작업 공간"이라는 아이디어를 CAB에서 차용한 것입니다.나는 내 자신의 Workspace 인터페이스를 작성하고 내 앱에서 사용할 자체 DeckWorkspace 및 TableWorkspace를 구현했습니다(이것들은 작성하기가 정말 간단했습니다).

이 최신 애플리케이션에서 내가 내린 많은 결정은 다른 프레임워크와 도구를 사용하면서 느꼈던 경험과 고통의 결과였습니다.이번에는 다른 결정을 내렸습니다.어쩌면 애플리케이션을 설계하는 방법을 실제로 이해하는 유일한 방법은 잘못했을 때의 고통을 미리 느끼는 것일 수도 있습니다.

저는 그렇다고 말하고 싶습니다. 더 작은 애플리케이션을 대상으로 쉽게 구성할 수 있습니다.시작하려면 학습 곡선이 있지만 솔직히 처음부터 시작하는 것보다 WPF를 더 잘 이해하는 데 도움이 되었습니다.CompositeWPF로 프로젝트를 시작한 후 CompositeWPF 없이 다른 프로젝트를 시작한 후, 저는 CompositeWPF의 기능을 놓쳤기 때문에 스스로 CompositeWPF의 기능을 복제하려고 시도했습니다!:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top