Próbuję ustalić, czy możliwe byłoby trzymanie się mantry "Program przeciwko interfejsowi, a nie implementacja". podczas korzystania z Entity Framework 4.0.Programowanie z interfejsami i Entity Framework 4.0
Podczas gdy znalazłem stronę wyjaśniającą, jak trzymać się powyższej zasady podczas korzystania z Linq-SQL (look here) Bardzo chciałbym wiedzieć, czy byłoby to możliwe z Entity Framework (również przy użyciu Linq) .
Jak to zwykle stosuje się:
var query = from pages in dataContext.Pages where pages.IsPublished select pages;
foreach (Page page in query)
{
// do something with page...
var routeQuery = from routes in page.Route where route.IsValid select routes;
foreach (Route route in routeQuery)
{
// do something with route
}
}
Ale chciałbym używać go tak:
var query = from pages in dataContext.Pages where pages.IsPublished select pages;
foreach (IPage page in query)
{
// do something with page...
var routeQuery = from routes in page.Route where route.IsValid select routes;
foreach (IRoute route in routeQuery)
{
// do something with route
}
}
Zasadniczo chciałbym być w stanie przejść DataContext z następujących Entity Framework z zespołu/podsystemu, w którym jest instancjonowany za pomocą interfejsu. Wszystkie informacje dostarczane przez kontekst danych powinny mieć postać interfejsu, a nie faktycznej klasy.
Chciałbym zachować rzeczywiste klasy wdrażające jednostki wewnątrz zespołu i ujawnić tylko te interfejsy, które implementują.
Czy to możliwe w Entity Framework? Jeśli nie, czy istnieje inny program odwzorowujący O/R, który można wykorzystać w ten sposób?
Jeśli nie jest to dobry sposób na dalsze oddzielenie DB od rzeczywistej aplikacji, chętnie wysłucham sugestii od Ciebie.
Dzięki za odpowiedź. Czy jest możliwe, aby repozytorium zwróciło ICollection interfejsu, np. ICollection podczas korzystania z EF? –
Kolejne pytanie :-): ile wystawiasz swoje repozytoriom na pozostałe aplikacje? Czy jest jakaś logika, np. IPersonProvider.GetPerson (nazwa łańcucha), która jest wywoływana przez aplikację i ostatecznie ukrywa repozytorium lub czy aplikacja wie o IRepository? –
@Timo Kosig - Oba dobre pytania. :) 1) Tak, myślę, że byłoby to możliwe - tak długo, jak zwracasz ICollection, a nie IQueryable. W tym celu musisz użyć Pure POCO (bez generowania kodu). Które używam. Ale wadą tego jest to, że musisz zaimplementować cały interfejs POCO, aby pomóc repozytorium. Niezły pomysł IMO. Powinieneś odciągać wytrwałość, a nie fakt, że używasz POCO. POCO są proste i fajne - nie trzeba ich ukrywać. :) – RPM1984