Visual Studio 솔루션에 대한 모범 사례 [닫기]


10

희망적으로 상대성 간단한 질문입니다. 건물 내부에서 수리 된 장치의 다루기 쉽도록 새로운 내부 프로젝트를 시작하고 있습니다.

데이터베이스는 웹 서버에 원격으로 저장되며 웹 API (JSON 출력)를 통해 액세스되며 OAuth로 보호됩니다. 프런트 엔드 GUI는 WPF에서 수행되고 비즈니스 코드는 C #에서 수행됩니다.

이것으로부터 나는 다른 계층의 Presentation / Application / Datastore를 봅니다. 인증 된 모든 API 호출, 엔티티 (비즈니스 오브젝트)를 나타내는 클래스, 엔티티 (비즈니스 오브젝트)를 구성하는 클래스, WPF GUI의 파트, WPF 뷰 모델의 파트 등을 관리하기위한 코드가 있습니다.

이것을 단일 프로젝트에서 만들거나 개별 프로젝트로 나누는 것이 가장 좋습니까?

내 마음에는 여러 프로젝트가 있어야한다고 말합니다. 이전에 두 가지 방법으로 모두 수행했으며 단일 프로젝트 솔루션으로 테스트가 더 쉽다는 것을 알았지 만 여러 프로젝트를 사용하면 재귀 종속성이 발생할 수 있습니다. 특히 클래스에 테스트하기 쉽도록 인터페이스가있는 경우 상황이 어색해질 수 있습니다.


1
프로젝트에 적합한 것으로 분리합니다.
Ramhound

MattDavey가 제안한 인터페이스를 유지하기위한 프로젝트에 대한 다른 생각이 있습니까? 언급 된 종속성을 피하기 위해이 방법을 사용했습니다. 또는 클래스 x의 인터페이스가 클래스 x와 동일한 프로젝트에 있어야합니다.
JonWillis

또한 모든 레이어를 사용합니다. 주요한 것은 Presentation / Application / Infrastructure이지만 몇 가지 다른 품종을 보았습니다. 일부는 응용 프로그램을 응용 프로그램 + 서비스의 두 부분으로 나눕니다. 일부 모델에는 비즈니스 로직에 대한 특정 계층이 언급되어있어 비즈니스 오브젝트 자체에 포함될 수도 있습니다.
JonWillis

답변:


8

프로젝트의 규모에 따라 다릅니다

내가 사용하는 지침은 다음과 같습니다.

  • 몇 페이지 이하의 작은 프로젝트는 거의 항상 단일 프로젝트를 유지합니다.

  • 작은 프로젝트의 데이터 액세스 계층이 크거나 복잡한 경우 해당 계층을 자체 계층으로 분리 할 수 ​​있지만 그렇지 않으면 자체 폴더에 있습니다.

  • 프로젝트가 더 크면 거의 항상 DAL에 대한 별도의 프로젝트가 있으며 추가 분할은 응용 프로그램 기능 사이의 경계에 따라 다릅니다.

  • 응용 프로그램에 각각 자체 뷰, 뷰 모델 등이있는 여러 목적이있는 경우 일반적으로 각 조각을 자체 영역으로 분리합니다. 각 섹션이 작 으면 폴더로 구분합니다. 각 섹션이 크면 프로젝트별로 구분합니다.

  • 내가 객체 (동일한 세트를 참조해야 할 여러 프로젝트가있는 경우 ViewModelBase, RelayCommand등), 난 그냥 공유 인프라 개체에 대한 프로젝트를 만듭니다.

  • 많은 양의 공유 사용자 정의 스타일 / 템플릿 / 리소스가있는 경우이를 위해 프로젝트를 작성합니다.

참고로, 첫 번째 큰 WPF 프로젝트에서 실수를 한 모델을 한 프로젝트에, 다른 프로젝트에 뷰를, 세 번째에 뷰 모델을 배치하여 분리했습니다. 유지 보수가 악몽이되기 때문에 갈 수있는 길이 아니라고 말할 수 있습니다. :)


궁금한 점은 레이어를 분리하여 어떤 유지 관리 문제가 있었습니까?
Ian

@Rachel, WPF를 사용할 것입니다. 따라서 프로젝트를 어떻게 조직했는지를 알고 싶다면 흥미로울 것입니다. 작은 MVC 프로젝트가 3 개의 부분을 3 개의 dll로 분리 할 때 고통 스럽다는 것을 기억할 수 있습니다. WPF의 경우 내보기는 GUI, 변경 될 엔티티 / 비즈니스 오브젝트 및 ViewModel 간의 상호 작용입니다. ViewModel은 리포지토리를 호출하여 수리를로드 / 저장하는 논리 (공장 / 웹 API 등)를 처리합니다.
JonWillis

1
@Ian 가장 큰 문제는 단일 필드 추가와 같은 대부분의 사소한 변경으로 인해 4 개의 개별 라이브러리에서 Model, View, ViewModel 및 DAL을 찾아야한다는 점이었습니다. 당시에 작업했던 프로젝트는 상당히 커서 특정 파일을 찾는 것보다 더 많은 시간을 낭비했습니다. 그 이후로 나는 그렇게 예를 들어, 아무것도 같은 검색 관련 위해 함께 관련 개체를 유지하기 위해 변경했습니다 SearchView, SearchViewModel그리고 SearchResultModel모든 폴더에 함께 그룹화 될 것이다 나는 그것을 유지하기 위해 앱을 쉽게 발견했습니다.
Rachel

@Ian 내가 리팩토링까지 내가 못생긴 해결 방법을했다, 그래서 나는 또한, 의존성 문제가 때문에 최선의 노력에도 불구하고, 순환 참조로 참조 다른 사람에게 필요한 몇 가지 레이어를 실행하지만, 그 층을 참조 된 기억
레이첼

1
@JonWillis 대부분의 WPF 프로젝트는 내 답변에 지정된 요점을 기준으로 분류됩니다. 일반적으로 DAL은 자체 레이어이며 각 모듈 또는 프로젝트의 섹션은 함께 그룹화됩니다 (프로젝트의 크기에 따라 자체 폴더, 네임 스페이스 또는 프로젝트). 예를 들어 Interface데이터 계층에 대한를 포함하여 모든 검색 개체가 함께 있지만 검색에 대한 실제 데이터 액세스 계층은 DAL 라이브러리에 있습니다. 종종 일반적인 기본 클래스, 인터페이스 및 도우미 클래스가 포함 된 Infrastructure또는 Common라이브러리가 있습니다.
Rachel

14

레이어 당 하나의 프로젝트와 레이어 당 테스트 프로젝트로 최상의 결과를 보았습니다. 솔루션이 모든 것을 포함하는 솔루션의 10 개 이하의 프로젝트에서 수행 할 수없는 애플리케이션은 거의 없습니다 .

실제로 이름 지정을 원하는 프로젝트를 사용하는 함정에 빠지지 마십시오. 수많은 프로젝트가 아무런 이익없이 오버 헤드 만 추가합니다.


9

IMHO 분리가 거의 항상 좋습니다. 프로젝트가 100 % 사소한 것이 아니라면 거의 항상 데이터 레이어를 분리합니다. 그 이유는 데이터 계층이 가장 자주 전달되는 경향이 있기 때문입니다. 드물게 여러 데이터 계층에 GUI를 연결하여 제대로 작동 할 것으로 기대합니다. 훨씬 일반적인 시나리오는 단일 데이터 계층이 있고 여러 GUI (예 : ASP.Net, WPF 및 Silverlight 앱)에 분산되도록하려는 것입니다. 데이터 계층 프로젝트를 빌드하고 다음에 빌드하는 GUI에서 dll을 참조로 넣을 수 있으면 좋습니다.


+1 새 프로젝트를 시작할 때 데이터를 메모리에 보관하는 시뮬레이션 된 데이터 레이어를 자주 만듭니다. 먼저 나머지 앱을 빌드 할 수 있습니다. 그런 다음 나중에 "실제"데이터 액세스 계층으로 교체 할 수 있습니다.
MattDavey

웹 서버와 통신하는 데 사용되는 엔터티 (DTO), 팩토리 및 클래스를 데이터 계층의 모든 부분으로 고려 하시겠습니까?
JonWillis

@ JonWillis-아니, 아마 그 전부는 아닙니다. 웹 서버의 팩토리와 클래스를 클래스 라이브러리 프로젝트의 네임 스페이스에 넣었습니다. 내 일반적인 데이터 레이어에는 필요한 dbml 파일 및 / 또는 edmx 파일 만 포함되어 있습니다. 그러나 원칙적으로 저는 "라이브러리 / 프레임 워크"에 자체 프로젝트를 제공합니다. 사람들이 항상 그렇게하는 것을 보았지만 GUI 프로젝트에 빠져들 필요는 없습니다.
Morgan Herlocker

그러나 실제로는 네임 스페이스를 몇 개 가져 와서 새 프로젝트로 분기하는 데 얼마나 오래 걸립니까? 꽤 쉬운 리팩토링 작업이라고 생각합니다.
Didier A.

4

나를 위해, 4 *는 마법의 숫자입니다. 각 계층 당 하나의 프로젝트와 이들 사이의 통신에 필요한 모든 인터페이스 / DTO를 정의하는 하나의 프로젝트.

단위 테스트를 세면 * 7


2

다른 레이어에서 작업하거나 서로 밀접하게 연결되어 있으면 항상 단일 솔루션을 사용했습니다. F5를 누르고 필요한 경우 모든 프로젝트를 다시 작성하고 싶습니다. "올바른"방법이 없다고 생각합니다.


2

개인적인 취향 에서 가장 중요한 것은 일관된 것 입니다. 개인적으로 응용 프로그램의 각 계층에 대해 별도의 프로젝트가 있으므로 분리가 분명합니다.


어떤 레이어로 분리합니까? 별도의 응용 프로그램 / 서비스 계층이 있습니까? 그렇다면 실제로 어떻게 다른가? 비즈니스 로직이 애플리케이션 / 서비스에 포함되어 있습니까? 아니면 실제 비즈니스 오브젝트에 대한 메소드입니까?
JonWillis

1

프로젝트 수의 증가는 단위 테스트를 활성화하고 의존성 그래프를 단순화하여 일이 복잡하지 않은 지점까지 앱의 한 부분에서 변경하면 앱과 관련이없는 것처럼 보일 수 있습니다.

일종의 종속성 반전을 수행 할 때 모든 "계약", 인터페이스, 추상 클래스, 데이터 전송 객체를 하나의 어셈블리에 넣습니다. 다른 어셈블리에서는 데이터베이스와 대화하는 모든 것을 넣었습니다. 단위 테스트는 자체 어셈블리를 얻습니다. UI를 기본적으로 테스트 할 수없는 경우 (예 : ASP.NET winforms) UI를 테스트 가능한 코드와 테스트 할 수없는 코드 (각 어셈블리)로 분할하면 상당한 이점이 있습니다. 때로는 데이터베이스, UI 또는 지금까지 언급 한 것과는 관련이없는 일부 코드가 표시되기 시작합니다. 원하는 코드는 .NET 프레임 워크에 있습니다. 이 코드는 유틸리티 어셈블리에 넣거나 적어도 루트 어셈블리 (아마도 인터페이스가있는 코드)에 넣습니다.

모든 어셈블리가 모든 어셈블리를 참조하거나 거의 참조하는 경우 단일 어셈블리로 다시 병합해야합니다. 귀하 또는 팀원이 데이터 계층 코드를 UI 및 UI에 데이터 계층 코드를 넣지 않도록하는 원칙이 부족한 경우 모든 계층을 단일 계층으로 병합하여 단순화합니다.

일부 Visual Studio 에디션은 약 15 개의 어셈블리에서 성능 문제가 발생하며 때로는 어떤 프로젝트가 있는지에 따라 다릅니다. 전략적으로 프로젝트 파일을 언로드하면 도움이 될 수 있습니다.


저는 현재 회사의 유일한 개발자입니다. 또한 대학 밖에서도 신선하므로 가능한 빨리 큰 프로젝트에 모범 사례를 심어주십시오. 시스템 사양을 문서화하기 전에 시스템 사양이 너무 많이 변경되어 최대한 빨리 시스템을 원한다는 요청에 따라 유지 관리 가능하게 만드는 데 관심이 있습니다. 귀하의 의견으로는 인터페이스 만 포함하는 어셈블리가 적합한 솔루션입니까? 그렇게하면 인터페이스와 팩토리 클래스에만 의존해야합니다.
JonWillis

1
예. 어셈블리 분할의 동기를 이해하는 것이 더 좋지만, 만약 당신 (혹은 당신의 팀 멤버)이 그것을 망치지 않는다면, 그것은 여전히 ​​저렴한 조작입니다. 따라서 모든 어셈블리에 의존하고 단위 테스트를 원하지 않는 모든 어셈블리로 끝나더라도 계약 (인터페이스, 추상 클래스)처럼 동작하는 것을 자체 어셈블리로 옮기는 것은 올바른 방향으로 나아가는 단계이며 단점이 거의 없습니다.
MatthewMartin

-2

둘 이상의 프로젝트가있는 유일한 이유는 여러 응용 프로그램간에 클래스 및 파일 세트를 공유해야하기 때문입니다.

하나의 응용 프로그램에서만 프로젝트를 사용하는 경우 처음부터 작성해서는 안됩니다. 대신 네임 스페이스를 사용하십시오. 파일을 찾을 때 순환 참조, dll 오버 헤드 및 프로젝트 혼란의 문제를 피하십시오.

그 때문에 이유의 더 나은 더 깊이 설명은이 기사를 읽기 : http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- 솔루션 파일 /

그리고 기사에서 알 수 있듯이 응용 프로그램에서 코드 공유와는 별도로 여러 프로젝트를 사용하여 그것이 무엇인지 알려주기 위해 유효한 이유가있는 사람은 누구나 환영합니다.


downvote에 대한 반론은 인정 될 것입니다.
Didier A.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.