14 września 2008
Odsłon: 3304
Parę tygodni temu ukazał się Service Pack do .NET Framework 3.5, a wraz z nim kilka zupełnie nowych technologii. Jedną z nich jest ADO.NET Entity Framework, czyli długo oczekiwany O/R mapper Microsoft, posiadający parę unikalnych zalet, ale też kilka poważnych braków. I to właśnie te braki wywołały ostatnio w środowisku burzę.
Akcja zainicjowana została przez społeczność ALT.NET, której przedstawiciele przygotowali specjalną petycję pt. "ADO .NET Entity Framework Vote of No Confidence". Pod listem udało się zebrać ponad 500 podpisów, w tym od wielu uznanych autorytetów w dziedzinie projektowania aplikacji. W gronie sygnatariuszy znaleźli się też liczni MVP, m.in. David Laribee, Jeremy D. Miller, Ayende Rahien czy Marc Clifton.
Dobry designer to za mało - potrzebna jest jeszcze elastyczna architektura.
Co spowodowało aż tak zdecydowaną reakcję społeczności? Otóż twórcy Entity Framework przegapili nasilającą się w ostatnich latach tendencję, zgodnie z którą aplikacje należy projektować w oparciu o model niezależny od infrastruktury, bierny, enkapsulujący całą logikę biznesową - według wzorca Domain Model. Źródłem tej koncepcji jest m.in. postulat POCO/POJO (Plain Old CLR/Java Objects), czyli rezygnacji z umieszczania w modelu kodu specyficznego dla wybranej technologii dostępu do danych, a także jakiejkolwiek innej, związanej z infrastrukturą. Owoce tego trendu zostały usystematyzowane przez Erica Evansa w książce "Domain-Driven Design: Tackling Complexity in the Heart of Software" (czym jest DDD można dowiedzieć się wstępnie np. z mojej prezentacji na LDI 2008).
Jak można się domyślić, Entity Framework ze wsparciem dla Domain-Driven Design ma poważne problemy. Żeby O/R mapper mógł być sensownie zastosowany do DDD, musi spełniać kryterium określane jako Persistence Ignorance (o którym napiszę szczegółowo wkrótce). W porównaniu do jednego z najpopularniejszych obecnie rozwiązań, czyli NHibernate, Entity Framework wypada pod tym względem blado. Co więcej, EF przegrywa tutaj także z LINQ to SQL! A to już jest bardzo dziwne...
Na szczęście jednak petycja poskutkowała. Zespół ADO.NET zaprosił do konsultacji kilka poważnych osobistości i poinformował, że w następnej wersji EF poziom Persistence Ignorance zostanie wyraźnie zwiększony. Microsoft musi się jednak spieszyć. Kilka dni temu ukazała się wersja 2.0 NHibernate, a do wersji 2.1 twórcy zapowiedzieli oficjalne wsparcie dla LINQ, co zneutralizuje główną przewagę Entity Framework. A już dzisiaj można korzystać z nieoficjalnej implementacji LINQ to NHibernate, dzięki pracy Ayende Rahiena.
Na koniec ciekawostka: Entity Framework można częściowo przystosować do DDD wykorzystując PostSharpa i techniki AOP. Szczegóły na blogu Ruurda Boeke.