Jako kod bazowy użyjemy obiekt encji tabeli:
Code:
klasa którą chcemy uzyskać ma następującą strukturę:
Code:
Kod mapowania:
Code:
użycie sprowadza się do wywołania metody Map na obiekcie bazowym:
Code:
Blog o tematyce związanej z platformą .NET i szeroko pojętym programowaniem. Znajdziesz tu informacje nt. platformy .NET, języka C#, wiadomości o wzorcach projektowych oraz tworzeniu poprawnej architektury oprogramowania.
public class PersonEntity { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public string Address { get; set; } }
public class PersonView { public string FullName { get; set; } public string Address { get; set; } }
public static class Mappers { public static PersonView Map(this PersonEntity personEntity) { return new PersonView { FullName = personEntity.FirstName + " " + personEntity.LastName, Address = personEntity.Address }; } }
var personEntity = new PersonEntity { Id = 1, Address = "Andrychowska 34, 10-124 Andrychów", Age = 31, FirstName = "Jan", LastName = "Kowalski" }; var pv = personEntity.Map();
"Nie musimy tworzyć całej biblioteki do mapowania" - mam nadzieję że nawet gdybyśmy całej biblioteki potrzebowali, to byśmy jej sami nie tworzyli ;) Po to są projekty jak np. ValueInjecter czy AutoMapper.
OdpowiedzUsuńOsobiście nie jestem pewien, czy wykorzystanie metody statycznej ma tutaj sens. Czemu nie zaimplementować np. metody FromEntity w samej klasie PersonView? Albo w ogóle osobnej klasy (wzorzec adapter)?
Metody statyczne mają to do siebie, że "wiszą" w osobnych, statycznych klasach i nie jest automatycznie oczywiste, gdzie ich w razie czego szukać.
Jeżeli nie ma jakichś konkretnych przeciwskazań, to w moim odczuciu warto dążyć do tego, by obiekt miał logikę dotyczącą samego siebie "pzzy sobie".
Co więcej, ze statycznych klas nie da się dziedziczyć i nie można ich mockować, co może okazać się przeszkodą np. przy pisaniu testów.
Często jest tak, że korzystamy z innej biblioteki do której kodu nie mamy dostępu.
UsuńInny powód to zasada "Single Responsibility Principle".
a nie lepiej tak ?
OdpowiedzUsuńPropertyInfo[] propslite = adifrowlite.GetType().GetProperties();
foreach (PropertyInfo prp in propslite)
{
if (prp.Name == "qsl_all_rcvd")
{
string tmp = adifrow.qsl_rcvd + "/" + adifrow.lotw_qsl_rcvd + "/" + adifrow.eqsl_qsl_rcvd;
adifrowlite.qsl_all_rcvd = tmp.Replace(" ", "");
}
else if (prp.Name.Contains(adifrow.GetType().GetProperty(prp.Name).Name))
{
PropertyInfo pi = typeof(ADIFRowLite).GetProperty(prp.Name);
pi.SetValue(adifrowlite, (string)Extensions.GetPropValue(adifrow, prp.Name), null);
}
}