내 응용 프로그램에서 데이터베이스 (Entity Framework) 및 MVC에 대한 다른 모델을 사용하여 항상 항목을 분리했습니다. 나는 이것들을 다른 프로젝트로 분리했다.
- Example.Entities -EF에 대한 엔티티 및 액세스를위한 DB 컨텍스트가 포함되어 있습니다.
- 예 . 모델-MVC 모델을 포함합니다.
- 예 . 웹-웹 애플리케이션. Example.Domain 및 Example.Models에 따라 다릅니다.
도메인 엔티티와 같은 다른 객체에 대한 참조를 보유하는 대신 MVC 모델은 ID를 정수로 보유합니다.
페이지에 대한 GET 요청이 들어 오면 MVC 컨트롤러는 데이터베이스 쿼리를 수행하여 엔터티를 반환합니다. 도메인 엔터티를 가져 와서 MVC 모델로 변환하는 "컨버터"메서드를 작성했습니다. MVC 모델에서 도메인 엔터티로 반대의 다른 방법이 있습니다. 그런 다음 모델이 뷰로 전달되어 클라이언트로 전달됩니다.
POST 요청이 들어 오면 MVC 컨트롤러는 MVC 모델을 가져옵니다. 변환기 메소드는이를 도메인 엔티티로 변환합니다. 이 방법은 또한 속성으로 표현할 수없는 모든 유효성 검사를 수행하며, 도메인 엔터티가 이미 존재하는 경우 새 속성을 얻는 대신 업데이트하고 있는지 확인합니다. 메소드는 일반적으로 다음과 같습니다.
public class PersonConverter
{
public MyDatabaseContext _db;
public PersonEntity Convert(PersonModel source)
{
PersonEntity destination = _db.People.Find(source.ID);
if(destination == null)
destination = new PersonEntity();
destination.Name = source.Name;
destination.Organisation = _db.Organisations.Find(source.OrganisationID);
//etc
return destination;
}
public PersonModel Convert(PersonEntity source)
{
PersonModel destination = new PersonModel()
{
Name = source.Name,
OrganisationID = source.Organisation.ID,
//etc
};
return destination;
}
}
이 방법을 사용하여 각 컨트롤러에서 발생하는 중복을 제거합니다. 제네릭을 사용하면 상황이 더욱 중복 될 수 있습니다.
이 방법으로 작업하면 여러 가지 이점이 있습니다.
- 모델을 특정보기 또는 동작으로 사용자 정의 할 수 있습니다. 제출할 때 다양한 엔티티 (사람, 조직, 주소)를 작성하는 사람에 대한 가입 양식이 있다고 가정하십시오. 별도의 MVC 모델이 없으면 매우 어려울 것입니다.
- 엔터티에서만 사용할 수있는 것보다 더 많은 정보를 뷰에 전달하거나 두 엔터티를 단일 모델로 결합해야하는 경우 소중한 데이터베이스 모델은 절대 손대지 않습니다.
- MVC 모델을 JSON 또는 XML로 직렬화 한 경우 다른 모든 엔티티가이 모델에 연결된 것은 아니지만 즉시 직렬화되는 직렬 모델 만 가져옵니다.