.NET 응용 프로그램간에 코드를 공유하는 가장 효과적인 방법은 무엇입니까?


15

우리의 작업에는 많은 기본 기능을 공유하는 여러 가지 .net 응용 프로그램이 있습니다. 우리는 깔끔한 n- 계층 아키텍처를 사용하여 이러한 응용 프로그램을 구축했지만 동일한 기능을 여러 번 다시 구현했다는 사실을 깨달았습니다. 분명히 이것은 DRY를 위반하므로 우리는 그것을 수정하고 싶습니다. 우리는 이미 일반적인 글루 코드 (IoC 연결, 로깅, 설정)를 위해 Nuget을 사용하고 있지만 모든 애플리케이션간에 데이터 및 비즈니스 계층을 공유하고 싶습니다. 아이디어는 UI가 실제로 필요한 비즈니스 계층의 일부만 처리한다는 것입니다.

이것은 처음에는 간단한 문제처럼 보이지만 진행중인 개발은 약간의 함정을 제공 할 수 있으며 진행 방법을 잘 모릅니다. 우리가 하나의 비즈니스 계층을 모든 것을 지배한다고 가정 해 봅시다. 간결하게하기 위해 "창립"이라고 부릅니다. 우리는 Foundation을 사용하기 위해 응용 프로그램을 이식하고 모든 것이 뛰어납니다. Foundation은 너겟을 통해 가벼운 UI 레이어에 배포되며 우리는 좋아 보입니다. 그러나 애플리케이션에 기능을 추가하기 시작하고 문제가 발생합니다.

프로젝트 A에서 작업 중이며 Foundation을 변경해야하는 새로운 기능을 추가한다고 가정하겠습니다. 우리는 재단 (Foundation-A)을 변경하고 불안정한 패키지로 너겟 피드에 밀어 넣습니다. 프로젝트 A는 최신 너겟 패키지를 얻었으며 모두 좋습니다. 한편, 다른 개발자가 프로젝트 B를 작업 중입니다. 소스 제어에서 최신 Foundation을 가져 오지만 안정적인 지점에서 가져와 프로젝트 A에 변경 사항이 없습니다. 그는 변경을하고 Foundation-B를 만들었습니다. 그리고 모두 좋다. 그러나 실제로 코드를 공유 할 수있는 Foundation-A 및 Foundation-B 구현 기능을 발견하여 결합합니다. 한편 Foundation-C는 자체 변경 사항이 반영되어 있습니다. 결국 Foundation-B는 생산 준비가 완료되었으므로이를 추진합니다. 그런 다음 프로덕션 A, B를 업데이트해야합니다.

이것은 작동하는 것처럼 보이지만 다른 데이터베이스 스키마로 작업하고 Foundation 리포지토리의 다양한 브랜치와 프로젝트 A, B 및 C 리포지토리간에 모든 항목을 동기화하는 것이 걱정됩니다. 아마도 많은 수동 작업이 필요할 것 같으며 오류가 발생할 가능성이 있습니다. 가능한 한 자동화를 원합니다.

우리가 사용하는 스택은 다음과 같습니다 : C #, TFS with Continuous Integration, Nuget. 우리의 응용 프로그램은 모두 다양한 유형의 ASP.NET 응용 프로그램입니다. 우리는 일을 더 쉽게 할 수 있도록 다른 SCM을 기꺼이 살펴볼 것입니다.

Nuget을 다른 소스 코드 브랜치로 유지하는 방법을 찾고 있습니다. 우리는 잘못된 Nuget 패키지를 참조하기 때문에 개발 코드를 실수로 프로덕션으로 푸시하고 싶지 않습니다.


또한, 이것이 이와 같은 토론을위한 좋은 포럼이 아니라면 누군가 더 나은 토론을 제안 할 수 있습니까?
Josh

답변:


9

우리는 재단 (Foundation-A)을 변경하고 불안정한 패키지로 너겟 피드에 밀어 넣습니다.

여기 문제가 시작되는 곳이 있습니다. 그렇게하지 마십시오.

Foundation v1.0의 모든 변경 사항은 본질적으로 Foundation의 모든 소비자에게 가치가 있어야합니다. 그렇지 않으면 Foundation에 속하지 않습니다. 따라서, nuget 패키지를 만들 때, 공식적이고 안정적인 Foundation 버전 (예 : v1.1)으로하거나 전혀하지 마십시오.

프로젝트 B는 평상시와 같이 재단 개선 사항을 구축해야하지만 (좋은 소스 관리 방식으로) 안정적인 재단 (v1.2)을 마비시키기 전에 트렁크 변경 (v1.1)을 병합해야합니다.

Foundation 개선 사항을 사용할 수있는 다른 프로젝트는 적절한 경우 Nuget 참조를 업그레이드하거나 필요한 경우 이전 버전을 사용할 수 있습니다.

@Giedrius에 동의합니다 . 이것은 Foundation의 분기 / 병합이 제대로 처리되면 패키지 관리 문제가 무의미하다는 점에서 소스 제어 / 분기 문제에 더 가깝습니다.


그렇습니다. 실제 적용에 문제가 있습니다. Foundation for v1.1을 업데이트 할 때 개발중인 프로젝트 B의 변경 사항을 사용하려고합니다. 해당 코드를 공유하는 방법이 nuget을 통해 수행되는 경우 옵션은 1) 새 nuget 패키지를 게시하거나 2) dll을 수동으로 복사하는 것입니다. 이들 중 어느 것도 좋은 선택처럼 보이지 않습니다.
Josh

이 중 일부는 효과적인 테스트 스위트를 사용하여 완화 할 수 있지만 기능을 추가 할 때 여전히 앞뒤로 진행될 것입니다.
Josh

@Josh 네, Foundation B의 업데이트는 프로젝트 B가 공유 라이브러리에 들어가기 때문에 어떻게 사용할 것인지에 관계없이 완전하고 테스트 가능해야하므로 '새로운 너겟 패키지 공개'가 자연스럽게 진행됩니다. Nuget에서 안정적인 패키지가 될 때까지 프로젝트 B에서 Foundation v.Next를 가져 와서 사용하지 마십시오. 약간의 훈련이 필요하지만 달리하는 것보다 훨씬 낫습니다.
Eric King

1
나는 당신이 말하는 것을 완전히 이해하지만 그것이 매우 현실적이라고 생각하지 않습니다. 기능을 개발할 때 모든 비즈니스 로직 및 데이터 액세스 계층을 완전히 테스트 했더라도 프로덕션 환경으로 넘어 가기 전에 수정 될 것입니다. 비즈니스 로직에 다른 속성을 추가해야하거나 제품 소유자가 변경 또는 설명을 다시 제공한다는 사실을 알고있을 것입니다. 아마도 귀하의 단순화 가정 중 일부가 잘못되었을 수 있습니다. 이것들은 항상 일어나는 일입니다. 기본 로직의 릴리스에서 잠금으로 제한되는 경우 실제로 매우 제한적인 것으로 보입니다.
Josh

2
몇 달 동안이 작업을 수행 한 결과 이것이 기본적으로 해결되었습니다. 나는 공식적인 절차에 대해 너무 걱정했다. 우리가 실제로 작업을 시작하면 일이 순조롭게 진행되었습니다. 입력 해 주셔서 감사합니다.
Josh

4

중복 된 코드를보다 추상적 인 방식으로 적용 할 수있는 함수로 리팩터링하여 자체 라이브러리 또는 프레임 워크에 넣습니다. 그것들을 느슨하게 결합하고 아키텍처에 구애받지 않게 만들면 아무런 문제가 없을 것입니다. 영감이 필요한 경우 .NET 프레임 워크가 인터페이스, 제네릭 및 같은 소프트웨어 패턴을 사용하여 개념을 추상화하는 방법을 연구하십시오 Dispose().

또한 모든 중복 코드가 실제로 복제되는 것은 아닙니다. 그중 일부는 아키텍처를 유지하는 데 필요한 접착제 코드 또는 코드이므로 너무 건조하는 것에 집착하지 마십시오.


어쩌면 나는 내 질문에있을만큼 명확하지 않았습니다. 이것은 다음에 오는 것에 관한 것입니다. 모든 작업을 완료했으며 이제 다른 프로젝트간에 코드를 효과적으로 공유해야합니다. 누군가는 "그냥 너겟 사용"이라고 말하고 세부 사항에 들어가서 다른 지점과 응용 프로그램의 다른 변경 사항을 동기화하는 방법과 같은 문제가 발생할 때까지 훌륭하게 들립니다.
Josh

글쎄, 나는 에릭 킹에 동의합니다. 기초 코드는 불안정하지 않은 안정적인 버전으로 푸시해야합니다. 핵심은 안정적인 API를 유지하는 것입니다. 기본 메소드의 서명이 변경되지 않을 것임을 알고 있다면 메소드를 Foundation으로 안전하게 푸시하고 나중에 아무 것도 깨지 않고 리팩터링 할 수 있습니다.
Robert Harvey

4

코드 재사용

지난 몇 년 동안 코드 재사용에 대한 몇 가지 접근 방식이 선호되었습니다. 각 접근 방식에는 그 위치가 있으며 더 중요한 문제 는 있지만 .NET에서 코드를 재사용하는 가능한 방법은 다음과 같습니다.

  1. 공통 도서관. 둘 이상의 장소에서 필요한 코드는 공통 라이브러리에 저장되며, 코드베이스의 다른 모든 부분에는이 코드에 대한 단일 참조가 있습니다. 원칙 단점은 많은 관련없는 기능을 포함하는이 라이브러리에 따라 대부분의 프로젝트로 끝나는 것입니다. 이것은 품질 보증 측면에서 나쁜 생각입니다.

  2. 공통 소스 코드. 둘 이상의 위치에 필요한 코드는 한 번 작성되고 공통 디렉토리 구조의 소스 파일에 배치됩니다. 이 코드가 필요한 모든 프로젝트는이 파일을 소스 파일 중 하나로 포함시킵니다. 이것은 코드 재사용을 제공하고 한 번 쓰기의 장점은 많이 사용합니다. 하나. 단점은이 코드의 다른 버전으로 컴파일 된 프로젝트의 다른 부분을 가질 수 있다는 것입니다. 이는 품질 보증으로 감지하고 식별하기가 매우 까다로운 미묘한 결함을 유발할 수 있습니다.

  3. 서비스. 공통 코드는 다른 측면에서 액세스 할 수있는 서비스로 구현됩니다. 이는 배치에 단일 서비스가 있으며 종속성을 피할 수 있다는 이점이 있습니다. 그러나 대기 시간과 실패가 발생합니다. 이러한 종류의 접근 방식은 고 가용성 및 내결함성이 이미 이해되고 관리되는 대규모 분산 제품에서 잘 작동합니다.

NuGET 관리

여기에 훨씬 더 흥미로운 문제가 있습니다. 여러 구성 관리 여기서 조언은 다양한 코드 버전이 아닌 구성 파일을 사용하여 다양한 고객 기반을 관리하는 것입니다. 관리 할 구성 데이터 계층은 3 개 이상입니다. 고객이 볼 수없는 기본 (내부) 제품 구성. 고객이 변경할 수있는 기본 구성 옵션 및 고객이 변경 한 구성 옵션의 마지막 계층. 이러한 여러 계층을 분리하면 고객 구성을 손상시키지 않고 업그레이드를 롤아웃 할 수 있습니다.


1

나는 문제가 너겟 / 소스 제어 / 브랜치가 아니라 접착 코드에 빠지는 것으로 생각합니다.

Robert는 전체 그림을보기 위해 이러한 일반적인 유틸리티가 각 프로젝트에 어떤 종속성을 가져 오는지 생각해 보는 것이 좋습니다.

http://ayende.com/blog/3986/let-us-burn-all-those-pesky-util-common-libraries http://blog.jordanterrell.com/post/CommonUtility-Libraries-Dead.aspx

지옥을 피하는 가장 좋은 방법은 접착제 코드를 오픈 소스로 만드는 것입니다. 이러한 방식으로 비즈니스 로직이 공개되지 않기 때문에 구체적인 프로젝트 의존성이 접착제 코드에 빠지지 않을 것이므로 회사 외부에서도 누구나 재사용 할 수있을 정도로 추상적 일 수 있습니다. 코드는 충분할 것입니다-커뮤니티의 의견도 얻을 수 있습니다.


"접착제 코드 관리에 대해 이야기하는 것이 아닙니다. 우리는 이미이를위한 솔루션을 가지고 있으며 잘 작동합니다. 비즈니스 로직 공유에 대해 이야기하고 있습니다. 예를 들어, 응용 프로그램이 조직과 사람을 관리하는 것을 다루고 있습니다. 따라서 우리는 개인을 생성하는 방법과 관련된 비즈니스 규칙이 많이 있습니다. 여러 번을 생성하는 대신, 객체 구성에서 다른 프로젝트간에 공유하는 객체를 유지하는 것까지 모든 것을 처리하는 하나의 패키지가 필요합니다.
Josh

0

해결책은 간단합니다. 별도의 프로젝트를 만들고 별도의 것으로 관리합니다. 자체 요구 사항, 테스트, 컨벤션, 문서, 계획, 사람 등입니다. 이렇게하면 품질이 유지되고 주요 변경 사항이 발생할 수 있습니다. 문제를 만들기 전에 먼저 평가합니다.

또는 더 나은 : 조직 내에서 "오픈 소스"로 만드십시오. 따라서 누구나 코드를 변경할 수 있지만 일부 선택된 사람 만 완전한 커밋 권한을 갖습니다. 그리고 그 사람들은 품질과 올바른 기능을 보장 할 책임이 있습니다.

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