2017-02-16 11 views
2

3 가지 응용 프로그램이 있습니다. 각 부분은 내 솔루션의 다른 부분에서 종속성을가집니다. MVC 프로젝트 내에 IDependencyResolver을 구현했습니다. 이는 레이어 분리의 아키텍처 규칙을 위반하기 때문에 잘못된 방법입니다. 내 MVC 프로젝트는 DAL 계층을 참조했습니다. 나쁜 코딩 방법입니다. 별도의 클래스 라이브러리 프로젝트를 만들 수 있다는 것을 알고 있습니다. 그것은 내 솔루션의 다른 프로젝트에 대한 참조를 갖습니다. 모든 종속성을 해결합니다. 나는 그것이 최선의 방법이 아니라고 들었다. 더 좋은 방법이 있습니다. 내 솔루션의 각 프로젝트는 종속성을 소유해야합니다. 나는 그것을 모두 모으는 법을 모릅니다. 그래서이 유용한 기사를 찾았습니다 : Dependency Injection Best Practices in an N-tier Modular Application하지만 너무 복잡하고 복잡해 보입니다. 다른 방법이 있습니까? 나는 비슷한 구조의 솔루션을 가지고있다. UserRepository은 요청 된 사용자를 반환합니다.N 계층 응용 프로그램에서 IDependencyResolver를 구현하는 방법은 무엇입니까?

public interface IUserRepository 
    { 
     IEnumerable<UserEntity> GetAll(); 
    } 

    public class UserRepository : IUserRepository 
    { 
     public IEnumerable<UserEntity> GetAll() 
     { 
      // some code 
     } 
    } 

UserService은 몇 가지 서로 다른 종속성을 가질 수 있습니다.

public interface IUserService 
    { 
     IEnumerable<UserModel> GetAll(); 
    } 

    public class UserService : IUserService 
    { 
     private readonly IUserRepository userRepository; 
     private readonly ISecondRepository secondRepository; 
     private readonly IThirdRepository thirdRepository; 

     public UserService(IUserRepository userRepository, ISecondRepository secondRepository, IThirdRepository thirdRepository) 
     { 
      this.userRepository = userRepository; 
      this.secondRepository = secondRepository; 
      this.thirdRepository = thirdRepository; 
     } 

     public IEnumerable<UserModel> GetAll() 
     { 
      // some code 
     } 
    } 

마지막으로 UserController 생성자에는 많은 서로 다른 종속성이있을 수 있습니다.

제 질문은 아키텍처 규칙을 위반하지 않도록 이러한 종속성을 해결할 수있는 권리와 가장 간단한 방법은 무엇입니까? 당신은 당신이 종속성을 구성하는 추가 레이어를 만들 수 있습니다 말했듯이

enter image description here

+0

런타임의 레이어 분리 규칙을 생각해보십시오. 응용 프로그램이 종속성 해석자에 의해 부트 스트랩 될 때 해석기를 올바르게 매핑 한 경우이 규칙을 따릅니다. 이 답변을보십시오 http://stackoverflow.com/questions/40401900/bootstrapping-unity-composition-root-location/40403875#40403875 –

+0

가능한 중복 [IOC/DI - 왜 모든 레이어/어셈블리를 참조해야합니까? 엔트리 응용 프로그램에서?] (http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application) – NightOwl888

답변

2

,이는 구성 루트 Check this SO question이라고합니다. 구성 루트가 MVC 프로젝트입니다. DAL을 참조하는 관점에서 볼 때 그 나쁜 습관은 아닙니다.종속성에 대해 말할 때을 그려야합니다. 우리가 의존성에 대해 이야기 할 때 dll 참조는 중요하지 않지만 사용되는 유형 (인터페이스 또는 콘크리트)은 중요합니다. 아시다시피 DI는 추상화에 따라 달라지며 실제 가치가 있습니다. 따라서 DAL의 인터페이스에만 의존하는 한 코드는 여전히 괜찮습니다.

실습에서 DLL 종속성이 너무 복잡 해지면 추가 프로젝트를 구성 루트로 사용했습니다.

질문에 대한 답변 어떻게 레이어가 종속성을 해결해야하는지. 나는 이것이 당신이 의미하는 것이 었는지 확신 할 수 없지만, DDD에서는 자신의 계층에서 인프라 인터페이스 (리파지토리와 같은)를 정의하기 위해 BLL을 연습합니다. 이 방법은 종속성 그래프가 존경합니다. 이제 인프라 계층 (DAL)은 BLL에서 제공된 인터페이스의 구체적인 구현만을 정의하고 다시 구성 루트에 모든 것이 연결됩니다.

인프라 계층에서 인터페이스를 정의하고 구현시 종속성이없는 장점이있는 첫 번째 접근 방식은이며 다른 프로젝트에서 재사용이 가능합니다. 그러나 큰 도메인에서 일할 때 이것은 때로 생각할 수없는 코드로 이어질 수 있습니다.

은 DDD가 가장 중요한 것은 도메인이므로 모든 것이 도메인에서 작동합니다. 내 경험에 의하면 도메인 주위에 잘 구조화 된 레이어를 갖는 것이 최선의 선택입니다. 이 apporach는 도메인에 대해 해결하는 문제에 대해 코드를보다 명확하게 만듭니다. 내가 자기 중심으로 표현했는지 모르겠다.

학습 경험으로 이것을 사용한다면 마지막으로 DDD 접근 방식을 제안 할 것입니다. 새로운 것을 배우는 것이 최선의 선택입니다.

나는 현장에서 가장 경험있는 사람이 아니다. 저는 약 3 년 동안 프로그래머입니다. 중간 크기의 프로젝트에서 주로 작업했기 때문에 제 견해는 견고하지 못합니다.]