1

우리의 이전 응용 프로그램에서 우리는 StructureMap을 사용했고 아주 적은 코드를 작성할 수있었습니다. asp.net 코어 빌드 - 인 의존성 삽입 긴 코드

는 모든 서비스하기 전에 우리는 같은 종속성을 추가 :

ObjectFactory.BuildUp(this); 

다음 시험에서 우리는 이제 단순히

var service = new XService(); 

에 의해 인스턴스화 할 수

[SetterProperty] 
public IXService XService { get; set; } 

생성자 우리 다른 애플 리케이션을 시작하고 asp.net 코어 내장 DI 컨테이너를 사용합니다. 우리가 각 시험 코드의 많은, 매우 긴 생성자 작성해야처럼 보이 :

private readonly ILogger<AccountsController> _logger; 
    private readonly IMapper _mapper; 
    private readonly IAccountBlService _accountBlService; 
    private readonly IValidationHelper _validationHelper; 
    private readonly IValidator<AccountDTO> _accountDTOValidator; 
    private readonly Example _example; 
    private readonly IConfiguration _configuration; 

    public AccountsController(BillingContext context, ILogger<AccountsController> logger, IMapper mapper, IAccountBlService accountBlService, 
     IValidationHelper validationHelper, IValidator<AccountDTO> accountDTOValidator, IOptions<Example> example, IConfiguration configuration) 
    { 
     _logger = logger; 
     _mapper = mapper; 
     _accountBlService = accountBlService; 
     _validationHelper = validationHelper; 
     _accountDTOValidator = accountDTOValidator; 
     _configuration = configuration; 
     _example = example.Value; 
    } 

우리가 발견 didnt한다 짧은 방법이 있나요를? 가까운 장래에 계획된 계획인가? 내장 컨테이너 대신 StructureMap을 사용해야합니까? 또는 이에 대한 단점이 있습니까? 감사!

답변

5
  • 우리가 찾지 못한 짧은 방법이 있습니까? 요컨대, 아니오, 기본 컨테이너가 아닙니다. 그러나 "Composition Root"에 대해 들어 봤기 때문에 Mark Seemann이 .NET에서 Dependency Injection을 읽는 것이 좋습니다. IMHO 의존성 선언 방식은 코드베이스 전체에 흩어져있는 동일한 양의 코드를 사용합니다. 반면 당신은 유지 보수를 위해 한 곳에 보관해야합니다.
  • 가까운 장래에 계획 되었습니까? 내가 아는 것은 아니지만, 실제로 보면 코드는 중앙 집중식입니다. 그러나 리플렉션을 사용하여 하나의 호출에서 모든 종속성을 등록하는 BusConfiguration에서 "RegisterComponents"를 호출하는 NServiceBus의 기능을 사용합니다. 같은 것을 할 수있는 컨테이너를 찾을 수 있습니다. 이제 당신의 테스트를 생각하고 있다면, XUnit을 사용한다면 테스트 클래스의 생성자를 통해 SUT를 설정할 수 있습니다. 팩토리 클래스에서 리 팩터링하면 한 번만 작성하면됩니다. 이렇게하면 시험을 깨끗하게 유지할 수 있습니다.
  • 기본 제공 컨테이너 대신 StructureMap을 사용해야합니까? 원할 경우. 우리는 Autofac을 사용합니다.
  • 단점이 있습니까? 우리가 지금까지 만난 것은 아닙니다. 때로는 특별한 '트릭'을 위해 IServiceProvider가 필요하지만 항상 방법이 있습니다.

참고 : (많은 참이다) 컨트롤러에 7 개 의존성 것을 우려 경우 몇 가지 옵션이 있습니다 : 종속성의 범위에서

  • 봐가. 1 또는 2 액션 메소드에서만 사용되는 경우 액션 메소드의 서명에서 [FromService]로 선언 할 수도 있습니다.

  • 컨트롤러가 너무 많이 작동하고 있습니까? 신의 수업에 조심하십시오. 리팩토링이 필요할 수도 있습니다. 결국 컨트롤러는 액션 메소드의 논리적 집합체에 지나지 않습니다.

  • 종속성을 결합 할 수 있습니까?때로는 분리되어야 할 필요가있는 것처럼 보이지만, 대부분의 경우 항상 쌍으로되어 있습니다. 높은 응집도가있는 것으로 보이며 응집력을 유지하기 위해 도우미 클래스로 결합 할 수 있습니다.