1

내 첫 번째 게시물이 너무 안녕하세요 :)소프트웨어 설계 : DI - 다중 어셈블리 + 비공개 유형

계단 패턴을 사용하고 있습니다. I은 할 어셈블리 A - 어셈블리 B에서 정의 된 인터페이스의 구현을 포함하는 어셈블리 B (인터페이스를 포함 함) 및 어셈블리 C에 따라 (엔트리 포인트 조성물 루트) -> B < - C

을 C#에서 개발 중이며 IoC 용 Castle Windsor를 사용하고 있습니다.

저는 또한 비공식 유형 (https://github.com/castleproject/Windsor/blob/master/docs/registering-components-by-conventions.md -> 비공개 유형 등록)을 등록 할 수있는 Windsor의 기능을 활용하고 있습니다. 어셈블리 C의 클래스를 내부 클래스로 정의하면 누구도 C에서 A와 직접적인 의존 관계를 만들 수 없으므로 유용하다는 것을 알았습니다. A와 C 모두 어셈블리 B에만 의존합니다. 어셈블리 B에는 나에게 맞는 소리 만 들어 있습니다.

이것이 좋은 디자인 선택이라면 궁금합니다. 내가 아는 한 Windsor 만 비공개 형식을 등록 할 수 있으며 비공식 형식을 공개하지 않기 때문에 경고합니다. 또한이 고려 사항은 .NET 환경에 국한되지 않는다고 생각합니다. 사용하는 기술에 관계없이이 문제에 대한 통찰력을 높이 평가할 것입니다. :)

+0

내부 형식이있는 각 어셈블리의 모듈을 사용하여 Autofac과 동일한 작업을 수행했습니다. 메인 (엔트리) 어셈블리는 등록해야하는 모듈 (예 : 전자 메일 모듈 등)을 인식하고 있습니다 (예 : 전자 메일 모듈 등) – Bishoy

답변

1

외부에서 C 클래스에 대한 액세스를 차단할 이유가 있습니까? 타사에서이 어셈블리를 사용하는 경우 (예 : 다른 사람이 사용할 수 있도록 NuGet 패키지로 게시 할 때)에만 의미가 있습니다. 시험이 어려워진다

  • 당신이 [InternalsVisibleTo]에 물건을 표시 할 필요가 있기 때문에, 다음과 같은 이유로 경우이 라이브러리의 유일한 소비자 만 일을 복잡하게 내부를 숨기고, 자신의 팀 안에 있습니다.
  • 컴포지션 루트에서 직접 구성 요소를 참조 할 수 있으므로 컴포지션이 어려워집니다. 필요할 때마다 하나씩 등록 할 때 직접 참조해야하거나 컨테이너에서 자동 와이어 처리하는 대신 수동으로 새 항목을 작성하려고 할 때 직접 참조해야합니다.
  • 어셈블리 루트 B (어셈블리 A)는 어셈블리 B에 대한 종속성을 갖는 유일한 어셈블리이기 때문에 기본적으로 컴포지션 루트의 종속성 만 숨기고 있습니다. 이는 의미가 없습니다. 왜냐하면 정의상 구성 경로 루트에 depends on all assemblies 신청.

반면에 클래스를 내부적으로 만드는 것은 재사용 가능한 라이브러리의 관점에서 많은 의미가 있습니다. .NET 프레임 워크 자체와 내부 구조가 얼마나 많은지 살펴보십시오. 내부에 물건을 만드는 것은 부서진 변화를 도입하지 않고 물건을 바꾸는 것을 더 쉽게 만듭니다.

+0

C 내부에서 구현을 유지하는 주된 이유는 B의 추상화에 A의 종속성을 적용하고 다른 사람이 의존성을 도입하지 않도록합니다. 또한 C에서 10 개의 클래스가 있고 그 중 절반이 테스트를 용이하게하기 위해 (C 내부의) 인터페이스를 추출했다고 가정 해 봅시다. 이러한 클래스가 A에 노출되는 것을 원하지 않습니다. 1. 원하지 않는 종속성을 피하십시오. A on C 2. 손으로 배선하지 마십시오. 따라서 C의 모든 클래스와 인터페이스는 IncludeNonPublicTypes 옵션을 사용하여 윈저에 의해 내부 및 자동 배선됩니다. –

+0

누군가가 InternalsVisibleTo 특성을 추가하고 모든 것이 다시 액세스 가능해질 때까지는. 네임 스페이스 종속성을 관리하거나 한 어셈블리에서 다른 어셈블리로의 종속성을 방지하는 단위 테스트를 작성하려면 NsCop과 같은 도구를 사용해보십시오. 또한 개발자가 코드 규칙을 가지고있는 이유에 대해 코드 검토와 적절한 의사 소통을하지 않으면이 규칙이 실패하게됩니다.건축상의 규칙은 시간 압력과 Conway의 법칙 때문에 깨질 것입니다. – Steven

+0

코드 검토가 매우 중요하다는 것을 알고는 있지만 더 큰 팀에서는 충분하다고 생각하지 않습니다. 가능한 한 많이 시행하는 것을 선호합니다. 하지만 어쩌면 그것을 (내부 수업 만들기) 이런 식으로 처리하고 잘못된 접근 방식을 오히려 자동화 된 테스트 경로를 통해 시행 아키텍처 규칙을 내려야합니까? 일반적으로 비록 내 어셈블리 C 어셈블리에서 클래스를 만들고 의존 의존성을 해결하기 위해 의존하는 경우 초기 질문은 자동으로 디자인 냄새였습니까? –

관련 문제