2017-02-11 4 views
1

안녕하세요, 저는 ViewModelFactory "패턴"을 구현하려고하는데 현재 IoC 컨테이너의 제약 조건을 고려할 때 무엇이 ​​가장 좋은 방법인지 궁금합니다.ASP.NET 코어 및 ViewModelFactory

public class UserCreateViewModelFactory 
{ 
    private readonly DbContext db; 

    public UserCreateViewModelFactory(DbContext db){ this.db = db;} 

    public void Create(CreateUserViewModel viewModel) 
    { 
      //Creates the user 
    } 
} 

나는 위의 클래스를 컨트롤러에 쉽게 삽입 할 수 있습니다. 좀 더 ViewModelBuilders을 필요로 할 때 머리의 통증이 올 것이다, 그래서 두 가지 피하고 싶은 : 주사와

  1. 블로 트의의 ctor
  2. 등록 내가 주입 할 수 있도록하려는

  • 블로 용기 내 컨트롤러에 IViewModelFactory 다음과 같이 그것을 사용 : Build(T)를 호출에가있다

    [HttpGet] 
    public IActionResult GetUsers(int id) 
    { 
        return View(viewModelFactory.Build<GetUserViewModel>(id)); 
    } 
    

    공지가 올바른 012 전화구현.

    StructMap 컨테이너가 구체적인 구현을 해당 인터페이스에 바인딩하는 것을 알고 있지만 프로젝트에 다른 dependecy를 추가 할 필요가없는 솔루션을 찾으려고합니다.

  • +0

    뷰 모델 생성을 추상화하려는 이유를 설명 할 수 있습니까? 뷰 모델은 DTO입니다. 그것은 컨트롤러가 전형적으로 스스로 새롭게해야 할 일입니다. 일반적으로 DTO 생성을 추상화 할 이유는 없습니다. – Steven

    +0

    복잡한보기 모델이 있다고 가정 해보십시오. 컨트롤러 코드 본체에 직접 생성 코드를 허용하는 것은 좋지 않습니다. 복잡한 비즈니스 코드를 수행하도록 서비스를 위임 한 이유와 동일한 원리입니다. 여기 슬림 컨트롤러를 목표로하고 있습니다. 따라서 사용자 요청에 응답하고 그 결과를 반환하는 것과 같이 동작은 거의하지 않아야합니다. –

    +0

    응용 프로그램에 [this one] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92)와 같은 디자인의 이점이있을 수 있습니다. – Steven

    답변

    0

    언젠가는 연구를 마친 후에 마침내이 문제에 대한 좋은 해결책이 떠올랐다.

    기본적으로 해결책은 IServiceCollection.ConnectImplementations() 확장 방법을 통해 기본 IoC 기능을 확장합니다.

    등록하는 동안 구체적인 클래스를 검색하고 해당 클래스를 다른 컨테이너와 같은 해당 인터페이스로 연결합니다. 그런 다음 IServiceCollection이 삽입 된 중개자/프록시를 사용하고 어떤 구체적인 클래스가 뷰 모델을 작성해야 하는지를 알고 있습니다.

    전체 솔루션은 this gist에 의해 더 잘 설명됩니다.

    1

    뷰 모델을 빌드하기위한 빌더가있는 경우 팩토리는 단순히 제거 할 수있는 추상화의 추가 레이어라고 생각합니다.
    컴파일 타임에 생성 된 뷰 모델의 유형을 알기 때문에 컨트롤러 생성자에 필요한 빌더를 삽입 할 수 있습니다.

    컨트롤러가 많은 뷰 모델을 만들고 주입해야하는 많은 빌더로 끝나는 경우 - 이는 단일 책임 원칙을 위반 한 것으로 간주 될 수 있습니다. 이 경우 제어기의 논리를 다른 제어기로 분리해야합니다.

    그래서 나는 두 가지를 피하려고 : 종속의 작은 양을합니다보다 구체적인 책임을 다른 클래스에 부풀어 생성자 주사

    • 별도의 클래스

      블로의 ctor에. 이 문제가 될 수 없습니다

      • 등록과의 관계

      블로 컨테이너에 따라 하나 또는 두, 세 개의 클래스와

    • 또는 랩 종속, 종속 용기는 일반적으로 설계 되었기 때문에 응용 프로그램의 전체 "객체 그래프"를 등록하십시오.
    +0

    컨트롤러가 다른 종속성을 사용할 수 있기 때문에 조직의 문제이기도합니다. 그리고 반드시 SRP를 위반하는 노래는 아닙니다. 도메인 요구 사항에 따라 다릅니다. 좋은 예는 CQRS + Mediator의 사용입니다. 이 답변은 (지정된대로) 문제 제한 사항을 다루지 않으므로별로 도움이되지 않습니다. –

    +0

    컨트롤러는 클래스 일뿐입니다. 클래스에 너무 많은 의존성 (질문의 주된 관심사)이 있으면 단일 책임 원칙을 위반합니다. 클래스는 하나의 변경해야 할 이유가 필요합니다. 따라서 컨트롤러에 다른 뷰 모델 생성 논리가 다른 경우 - 일부 로직을 변경해야하는 경우 컨트롤러 코드를 변경해야합니다. – Fabio

    +0

    그건 사실이 아닙니다. 매개 변수의 양은 SRP의 위반을 나타내지 않습니다. 알 수 있듯이 코드가 냄새를 맡을 수도 있고 SRP 위반 가능성이 있음을 나타낼 수도 있습니다. 왜냐하면 코드가해야 할 일보다 더 많은 일을 할 수도 있기 때문입니다. 예를 들어 ProductController를 사용하면 뷰를 Product 엔터티로 라우팅/반환해야합니다. 어쩌면 내가 다른 방식으로 제품을 편집/표시 할 수있는 비즈니스 요구 사항을 가지고 있습니다. 이 경우 내 "변경해야하는 한 가지 이유"는 해당 컨트롤러에 있어야하는 내 도메인과 관련된 기능을 제공하는 것입니다. –