2012-11-20 2 views
2

저는 프로젝트에서 컨트롤러로부터 객체를받는 서비스 레이어를 DTO로 바꾸고 리포지토리에 보냅니다. 내 프로젝트의 모든 엔티티 클래스에 대해 엔티티의 속성과 정확히 동일한 DTO가 필요하다고 생각합니다. 그것이 좋은 아키텍처DTO의 속성은 엔티티의 속성과 같습니다.

  1. 인가 :

    public class PersonDto 
        { 
         public int Id { get; set; } 
         public string Name { get; set; } 
         public int Age { get; set; } 
        }; 
    
        public class Person 
        { 
         public int Id { get; set; } 
         public string Name { get; set; } 
         public int Age { get; set; } 
        }; 
    
        public class PersonController : Controller 
        { 
         public ActionResult Create(CreatePersonViewModel createPersonViewModel) 
         { 
          var personDto = //here I map createPersonViewModel to a PersonDto 
          _personCreateService.Create(personDto); 
         } 
        } 
    
        public class PersonCreateService 
        { 
         public void Create(PersonDto personDto) 
         { 
          _repository.Create(personDto); 
         } 
        } 
    
        public class PersonRepository 
        { 
         public void Create(PersonDto personDto) 
         { 
          Person person = PersonMapper.Map(personDto); 
    
          _db.Person.Add(person); 
         } 
        } 
    

    그래서, 나는 그것에 대해 몇 가지 질문이 : 내가 몇 가지 코드를 보여주지 ?

  2. dto를 서비스중인 엔티티 또는 저장소에만 매핑해야합니까?
  3. 내 개체가 내 개체와 동일하게 만드는 데 문제가 있습니까?
  4. 자습서가 많이 가르쳐지기 때문에 내 컨트롤러에서 dbContext를 직접 사용하지 않는 것이 바보입니까?

답변

1

나는 몇 가지 질문에 답하려고 노력할 것입니다.

1 - 좋은 아키텍처입니까?

아마도. NHibernate, Entity Framework와 같은 ORM 도구를 사용하는 경우 concret 형식이 아닌 프록시가 있기 때문에 ORM 도구에서 일시적인 개체를 공유 할 수 없다고 생각해야합니다. ORM 도구에서 직접 개체를보기를 좋아하지 않습니다. viewModel 또는 DTO를 사용하는 것을 선호합니다.

2 - dto를 서비스중인 엔터티 또는 저장소에만 매핑해야합니까?

서비스가 ViewModel을 반환해야 할 수도 있습니다.보기가 필요하기 때문일 수도 있지만 때로는 Query에서 직접 결과를 지정해야하고 Repository에서 가져 오는 경우가 있습니다.

3 - 내 개체가 내 개체와 동일하게 만드는 데 문제가 있습니까?

아니요, 때때로 50 개의 속성이있는 엔티티가있을 수 있으며 5 개 또는 6 개의 속성이있는보기에서만 그리드를 표시해야하므로이 5 개 또는 6 개의 속성으로 ViewModel을 만들어야합니다. 엔티티를 ViewModel 유형으로 변환합니다.

개체를 매핑하는 데 도움이되는 AutoMapper이라는 멋진 도구가 있습니다. 당신은 그것을 사용하는 것을 고려해야합니다.

asp.net mvc를 사용하여 객체 지향 프로그래밍의 모범 사례를 채택한 ViewModel과 함께 게시물을 정리하고 가져 오는 방법에 대한 Asp.Net MVC 및 AutoMapper의 지미 Bogard 구현이 훌륭합니다.

http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/

+1

당신은 또한 자동으로 EDMX 파일에서 DTO들과 어셈블러를 생성하기 위해 [EntitiesToDTOs] (http://entitiestodtos.codeplex.com)를 사용할 수 있습니다. – kzfabi

+0

AutoMapper에 대해 알고 있습니다.하지만 실제로 엔티티와 동일한 엔티티가 필요한지 스스로에게 묻습니다. 현재 나는 DTO를 사용하지만 조금 지루하다고 생각합니다. – MuriloKunze

+1

예, 귀하의 요지를 이해합니다. ORM의 일시적인 객체 (프록시)가 있고보기로 보내면 괜찮 으면 좋겠지 만 상상하면 엔터티의 게으른 속성을 호출하므로 데이터베이스에 뷰가 표시되므로 상상해보십시오. 뷰가 컨트롤러에 의해 처리되어야하는 모든 것을 준비해야하기 때문에'ViewModel '을 가질 필요가있다. AutoMapper, EntitiesToDTO 등의 도구가있는 이유입니다. –