Memperkemas Pemetaan DTO untuk Hartanah Anak Tunggal dalam Teras EF
Teras Rangka Kerja Entiti (Teras EF) memudahkan penukaran objek-ke-DTO (Objek Pemindahan Data) menggunakan pepohon ekspresi. Ini berfungsi dengan baik untuk koleksi kanak-kanak, tetapi memetakan sifat anak tunggal mungkin kurang intuitif. Artikel ini meneroka penyelesaian untuk menggunakan semula kod dan mengendalikan senario ini dengan cekap.
Cabaran: Pemetaan Harta Anak Bujang
Memetakan secara langsung sifat anak tunggal kepada DTO selalunya memerlukan penambahan ungkapan manual, yang membawa kepada kod berulang. Pertimbangkan contoh ini:
<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>
Penyelesaian: Memanfaatkan Perpustakaan Luar
Beberapa perpustakaan menyediakan penyelesaian yang elegan dengan menambahkan fungsi seperti .Select()
untuk entiti tunggal dengan berkesan, sekali gus membolehkan penggunaan semula kod:
1. LINQKit:
LINQKit membolehkan pengembangan ekspresi, mengendalikan pemetaan anak tunggal secara dinamik.
<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 menawarkan pendekatan serupa menggunakan suntikan lambda.
<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 menawarkan sintaks yang lebih ringkas menggunakan sifat yang dikira. Ambil perhatian bahawa pendekatan ini mungkin tidak selalu sesuai bergantung pada kerumitan pemetaan anda.
<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>
Setiap pustaka memerlukan persediaan dan konfigurasi yang sesuai untuk berfungsi dengan betul dalam projek anda.
Kesimpulan:
Perpustakaan ini menawarkan penyelesaian yang cekap untuk menggunakan semula kod apabila memetakan sifat anak tunggal kepada DTO dalam Teras EF, mengurangkan redundansi dan meningkatkan kebolehselenggaraan. Memilih perpustakaan yang betul bergantung pada keutamaan dan kerumitan projek. Manfaat teras ialah pendekatan yang konsisten dan KERING (Jangan Ulangi Diri Sendiri) untuk pemetaan DTO.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Semula Kod untuk Memetakan Sifat Anak Tunggal kepada DTO dalam Teras EF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!