Wałkuje od pewnego czasu WCF, a teraz zaczynam pisać aplikację opartą o SOA i nie mogę dojść jak to jest z atrybutem [DataContract] - jak tego używać.
Załóżmy że mam rozdzielony projekt na różne komponenty. Na przykład stworzyłem sobie bibliotekę klas powiedzmy MyApp.Contracts w której mam między innymi DataContract.Mam też bibliotekę klas z Encjami na podstawie których EF utworzy sobie bazę danych. Powiedzmy że mam encję Person oraz encję Car. Te dwie encje połączone są ze sobą relacją jeden do wielu.
public class Person
{
public int PersonId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public virtual ICollection<Car> Cars {get; set;}
}
Mój Data Contract
public class PersonData
{
public int PersonId {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public virtual ICollection<CarData> Cars {get; set;} //czy ta linijka jest poprawna ? chodzi mi o to CarData ?
}
To jest mój serwis
public class DataService : IDataService
{
PersonRepository repository = new PersonRepository();
public IEnumerable<PersonData> GetAll()
{
IEnumerable<Person> result = repository.GetAll();
//TUTAJ MAPUJE ENCJE PERSON NA PERSONDATA (DataContract)
IList<PersonData> resultData = new List<PersonData>();
foreach (var p in result)
{
resultData .Add(new PersonData { FirstName = p.FirstName, LastName = p.LastName, Cars = p.Cars });
};
return resultData;
}
}
Kontroler w aplikacji Klienta -ASP.NET MVC
public ActionResult DisplayAll()
{
IEnumerable<PersonData> list= proxy.GetAll();
List<DisplayAllViewModel> viewModel = new List<DisplayAllViewModel>();
foreach(var x in list)
{
viewModel.Add(new DisplayAllViewModel { FirstName = x.FirstName, LastName = x.LastName });
}
return View(viewModel);
}
Czego tu nie rozumiem? Czy mam oznaczyć sobie moje Encje, czyli klasę Person i Car jako [DataContract] i [DataMember], czy mapować ją w relacji 1:1 na PersonData, a encje pozostawić bez żadnych atrybutów związanych z WCF?
Jeżeli powinienem dać atrybuty [DataContract] i [DataMember] na encje to teraz w repozytorium mam mieć powiedzmy dwie różne metody? np:
public class DataService : IDataService
{
PersonRepository repository = new PersonRepository();
public IEnumerable<PersonData> GetSelected()
{
IEnumerable<Person> result = repository.GetAll();
//TUTAJ MAPUJE ENCJE PERSON NA PERSONDATA (DataContract)
IList<PersonData> resultData = new List<PersonData>();
foreach (var p in result)
{
resultData .Add(new PersonData { FirstName = p.FirstName });
};
return resultData;
}
public IEnumerable<Person> GetAll()
{
IEnumerable<Person> result = repository.GetAll();
return result;
}
}
Proszę o jakieś wytłumaczenie jak postępować z data kontraktami. Dzięki!