EF Core에서 단일 하위 속성에 대한 DTO 매핑 간소화
EF Core(Entity Framework Core)는 식 트리를 사용하여 개체에서 DTO(데이터 전송 개체)로의 변환을 단순화합니다. 이는 하위 컬렉션에 적합하지만 단일 하위 속성을 매핑하는 것은 덜 직관적일 수 있습니다. 이 문서에서는 코드를 재사용하고 이 시나리오를 효율적으로 처리하기 위한 솔루션을 살펴봅니다.
과제: 단일 하위 속성 매핑
단일 하위 속성을 DTO에 직접 매핑하려면 수동으로 표현식을 추가해야 하므로 반복적인 코드가 발생하는 경우가 많습니다. 다음 예를 고려해보세요:
<code class="language-csharp">public static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = new AnotherChildModelDto // Manual mapping here { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
해결책: 외부 라이브러리 활용
여러 라이브러리는 단일 엔터티에 대해 .Select()
과 유사한 기능을 효과적으로 추가하여 코드 재사용을 가능하게 하는 우아한 솔루션을 제공합니다.
1. LINQKit:
LINQKit을 사용하면 표현식 확장이 가능하여 단일 하위 매핑을 동적으로 처리할 수 있습니다.
<code class="language-csharp">[Expandable(nameof(AsDtoImpl))] public static ModelDto AsDto(Model model) { _asDtoImpl ??= AsDtoImpl().Compile(); return _asDtoImpl(model); } private static Func<Model, ModelDto> _asDtoImpl; private static Expression<Func<Model, ModelDto>> AsDtoImpl => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // LINQKit handles this };</code>
2. NeinLinq:
NeinLinq는 람다 주입을 사용하여 유사한 접근 방식을 제공합니다.
<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { _asDto ??= AsDto().Compile(); return _asDto(model); } private static Func<Model, ModelDto> _asDto; private static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // NeinLinq handles this };</code>
3. DelegateDecompiler:
DelegateDecompiler는 계산된 속성을 사용하여 더욱 간결한 구문을 제공합니다. 매핑의 복잡성에 따라 이 접근 방식이 항상 적합하지 않을 수도 있습니다.
<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // DelegateDecompiler handles this };</code>
각 라이브러리가 프로젝트 내에서 올바르게 작동하려면 적절한 설정과 구성이 필요합니다.
결론:
이러한 라이브러리는 단일 하위 속성을 EF Core의 DTO에 매핑할 때 코드를 재사용하여 중복성을 줄이고 유지 관리성을 향상시키는 효율적인 솔루션을 제공합니다. 올바른 라이브러리를 선택하는 것은 프로젝트 선호도와 복잡성에 따라 다릅니다. 핵심 이점은 DTO 매핑에 대한 일관되고 DRY(Don't Repeat Yourself) 접근 방식입니다.
위 내용은 EF Core의 DTO에 단일 하위 속성을 매핑하기 위해 코드를 어떻게 재사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!