ile çocuk koleksiyonunun eşlenmesi Çok fazla bir soru değil, istediğimi yapmanın bir yolunu bulduğumdan, ama bunu yapmanın daha iyi bir yolu olmalı. Her yerde aradım ve hiçbir şey bulamadım.AutoMapper
Temel olarak, çok standart bir nesne modelini düşündüğüm var.
public class Parent
{
private readonly IList<Child> _children = new List<Child>();
public IEnumerable<Child> Children { get { return _children; } }
public void AddChild(Child child)
{
child.Parent = this;
_children.Add(child);
}
}
ve
public class Child
{
public Parent Parent { get; set; }
}
(Sorun ve hata kontrolü için alakasız ve açıklık bakımından koruma özelliklerini ihmal ettik ...)
public class ParentDTO
{
List<ChildDTO> Children = new List<ChildDTO>();
}
ve
public class ChildDTO
{
}
Çocukları koleksiyona eklemek için bir yöntem kullanmamın nedeni, bir çocuk eklendiğinde işlenmesi gereken iş mantığının denetimini sağlamaktır. standart haritalama ile
:Mapper.CreateMap<Parent, ParentDTO>();
Mapper.CreateMap<ParentDTO, Parent>();
Mapper.CreateMap<Child, ChildDTO>();
Mapper.CreateMap<ChildDTO, Child>();
hizmet katmanından gelen iyi çalışıyor gibi görünüyor. Etki alanı nesnesinin çocukları mükemmel bir şekilde ChildDTO
örnekleri listesine eşler. Ancak, başka bir şekilde yeniden eşleştirilirken, etki alanı modelindeki koleksiyon ayarlanmamıştır - çünkü açıkçası, açıktır. AutoMapper kullanarak özel alanı doğrudan ayarlamak için herhangi bir yol görünmüyor. Burada ve internetin diğer bölümlerinde bulunan çeşitli önerileri denedim. Sonunda
Mapper.CreateMap<ParentDTO, Parent>()
.ForMember(m => m.Children, o => o.Ignore())
.AfterMap((s, d) =>
{
foreach(var c in s.Children)
d.AddChild(Mapper.Map<ChildDTO, Child>(c));
});
Bu benim gerektiği gibi çalışır. Bununla birlikte, daha iyi bir yolun olması gerektiğini hissetmeme yardımcı olamıyorum ve bunu çocukları modifiye edilmiş ve belki de eklenmiş ve kaldırılmış olan var olan bir ebeveynle test etmedim, bu yüzden henüz doğru olmadığını biliyorum. Nihayetinde, bu alan modeli NHibernate kullanılarak kalıcıdır, bu yüzden bunun için endişelenmeliyim. Ama, her seferinde bir şey. Umarız bu, aynı sorunla karşılaşan başka birine yardımcı olabilir ve belki de uygun bir şekilde çözmüş biri beni düzeltecektir.
+1 sonrası çözümünüz beni kurtardı. –
Soğuk çözüm. Ödünç alacağım :-) – LeftyX
AfterMap ile harika bir fikir. Kaynak ve Hedef nesneler ile ResolutionResult ve bunun gibi şeyler ile çalışmak çok daha kolay! – Andrei