© 2015 Profinit. All rights reserved.
Entity Framework
v enterprise aplikacích
Tomáš Vichta 28. 11. 2015
© 2015 Profinit. All rights reserved.
2
Entity Framework
v enterprise aplikacích
o Design vzorové aplikace
o Automapper
o CRUD
o DbContext
© 2015 Profinit. All rights reserved.
3
Entity Framework
v enterprise aplikacích
o Cílový projekt
– Menší až střední datově orientovaná webová aplikace
– Převážně atomické CRUD operace (Create, Read, Update, Delete)
• Konfigurační nástroje, reporty, jednoduché datové vazby
– Zjednodušený CQRS pattern (Command Query Responsibility Segregation)
• a přizpůsobený pro použití s EF
– Společné sdílené komponenty
– Celkem silná vazba na EF
• může být nevýhoda
• šlo by vylepšit, ale za cenu vyšší složitosti
– Logiku pro specifické operace (jiné než klasický CRUD/CQRS) může být vhodnější
implementovat paralelně vedle, samostatně
• Je pak k diskuzi, zda komplikovat aplikaci 2 odlišnými přístupy pro práci s daty, nebo to celé
navrhnout jinak a jednotně.
© 2015 Profinit. All rights reserved.
Datové objekty a aplikační vrstvy
© 2015 Profinit. All rights reserved.
AutoMapper
o nuget balíček AutoMapper, http://automapper.org/
o Automatické mapování mezi datovým objekty (Entity, Dto objekty, View models, …)
o Podpora EF Linq, Expressions (AutoMapper.QueryableExtensions)
o Lze integrovat s Dependency Injection frameworky
o Podpora pokročilých funkcí (custom mapování)
o Podpora mapování collections
© 2015 Profinit. All rights reserved.
6
CRUD
Queries – zobrazení dat
© 2015 Profinit. All rights reserved.
7
CRUD
Modifikace dat
© 2015 Profinit. All rights reserved.
8
Datové objekty
o Datové objekty mají vždy primární klíč: Int32 Id
– Toto omezení může někdy vadit, pro CRUD je to tak ale obvykle OK
– Často to takto vyžadují GUI komponenty (např. Telerik Kendo grid)
o EF entity, BusinessDto a ViewModel objekty
– BusinessDto nebo i EF entitu lze poslat až na UI vrstvu
– zanášíme tím ale závislost na nižších vrstvách
– pro jednoduché scénáře lze akceptovat
– správně – samostatné ViewModel objekty pro Create, Update, i Delete
• designově OK, ale přidělává to práci
• často se používá jediný objekt (přímo EF entita) pro celý CRUD – spíš nedoporučuji, ale záleží
na typu a velikosti projektu
© 2015 Profinit. All rights reserved.
9
Design obecně
o Create/Update/Delete operace
– I Update by šel udělat genericky, ale takto je to bezpečnější
– Nenačítáme entitu před update/delete, protože to není třeba
• Při editaci 1 entity by to typicky nevadilo, problém při editaci mnoha entit najednou
o CrudFacade
– Šlo by to i bez Facade, možná by to bylo i designově čistější
o Dependency Injection
– Standard a základ
– Co nejméně kombinovat se singletony, statickými třídami a ručně vytvářenými objekty
• Problém obecně u Atributů, MVC - Razor helpery, atd.
o Zapouzdření
– pouze "hlavní" interfaces a datové objekty jsou public
– Třídy v Business vrstvě internal
– MVC Controllers a další MVC komponenty ve WebUI musí být public
• vlastnost MVC a .NET - např. runtime kompilace Views v samostatné app. doméně
© 2015 Profinit. All rights reserved.
10
DbContext
o Lifecycle
– Unit of work – ale jak velkou tu Unit of work uděláme?
– PerWebRequest – častý kompromis
– Alternativně lze doporučit menší scope: per-facade, per-operation
– Pokud váháte, dělejte spíš menší scope, než větší – EF má problémy, když projde
ChangeTrackerem stovky a více entit.
o Dependency Injection
– Objekt jako každý jiný – proč jej neřídit pomocí DI?
– Umožní injectovat závislosti, viz. příklad:
• IDateTimeFacade
• Pro automatické nastavování CreatedAt, ModifiedAt, DeletedAt
• Pro testy složitých integrací – možnost uměle posunout čas pomocí testovací implementace
• Opatrně potom na používání času na DB serveru – GETDATE(), ….
• IAuthenticationService – pro automatické nastavování CreatedBy, ModifiedBy, DeletedBy
o Definovat vlastní repository na DbContextem?
© 2015 Profinit. All rights reserved.
Diskuze
© 2015 Profinit. All rights reserved.
Díky za pozornost
• 1
© 2015 Profinit. All rights reserved.
Profinit, s.r.o., Tychonova 2, 160 00 Praha 6, +420 224 316 016, www.profinit.eu
Společnost PROFINIT je členem nadnárodní skupiny New Frontier Group, která je
leadrem v oblasti digitální transformace organizací a firem ve střední a východní
Evropě. S více než 2000 zaměstnanci v 17 zemích patří mezi deset největších
poskytovatelů ICT služeb v celém CEE regionu a řadí se ke špičce v oblasti vývoje
software na zakázku, data managementu, datových skladů a business intelligence.
PROFINIT má řadu významných zákazníků z finančního a telekomunikačního
sektoru, utilit a státní správy. Společnost se primárně zaměřuje na konzultační
služby v oblasti digitální transformace, technologické služby a outsourcing. Podle
údajů IDC (2012) patří PROFINIT mezi 5 největších firem v oblasti vývoje software
na zakázku v České Republice a je držitelem řady dalších ocenění.
Shaping future, delivering results!

Entity Framework v enterprise aplikacích

  • 1.
    © 2015 Profinit.All rights reserved. Entity Framework v enterprise aplikacích Tomáš Vichta 28. 11. 2015
  • 2.
    © 2015 Profinit.All rights reserved. 2 Entity Framework v enterprise aplikacích o Design vzorové aplikace o Automapper o CRUD o DbContext
  • 3.
    © 2015 Profinit.All rights reserved. 3 Entity Framework v enterprise aplikacích o Cílový projekt – Menší až střední datově orientovaná webová aplikace – Převážně atomické CRUD operace (Create, Read, Update, Delete) • Konfigurační nástroje, reporty, jednoduché datové vazby – Zjednodušený CQRS pattern (Command Query Responsibility Segregation) • a přizpůsobený pro použití s EF – Společné sdílené komponenty – Celkem silná vazba na EF • může být nevýhoda • šlo by vylepšit, ale za cenu vyšší složitosti – Logiku pro specifické operace (jiné než klasický CRUD/CQRS) může být vhodnější implementovat paralelně vedle, samostatně • Je pak k diskuzi, zda komplikovat aplikaci 2 odlišnými přístupy pro práci s daty, nebo to celé navrhnout jinak a jednotně.
  • 4.
    © 2015 Profinit.All rights reserved. Datové objekty a aplikační vrstvy
  • 5.
    © 2015 Profinit.All rights reserved. AutoMapper o nuget balíček AutoMapper, http://automapper.org/ o Automatické mapování mezi datovým objekty (Entity, Dto objekty, View models, …) o Podpora EF Linq, Expressions (AutoMapper.QueryableExtensions) o Lze integrovat s Dependency Injection frameworky o Podpora pokročilých funkcí (custom mapování) o Podpora mapování collections
  • 6.
    © 2015 Profinit.All rights reserved. 6 CRUD Queries – zobrazení dat
  • 7.
    © 2015 Profinit.All rights reserved. 7 CRUD Modifikace dat
  • 8.
    © 2015 Profinit.All rights reserved. 8 Datové objekty o Datové objekty mají vždy primární klíč: Int32 Id – Toto omezení může někdy vadit, pro CRUD je to tak ale obvykle OK – Často to takto vyžadují GUI komponenty (např. Telerik Kendo grid) o EF entity, BusinessDto a ViewModel objekty – BusinessDto nebo i EF entitu lze poslat až na UI vrstvu – zanášíme tím ale závislost na nižších vrstvách – pro jednoduché scénáře lze akceptovat – správně – samostatné ViewModel objekty pro Create, Update, i Delete • designově OK, ale přidělává to práci • často se používá jediný objekt (přímo EF entita) pro celý CRUD – spíš nedoporučuji, ale záleží na typu a velikosti projektu
  • 9.
    © 2015 Profinit.All rights reserved. 9 Design obecně o Create/Update/Delete operace – I Update by šel udělat genericky, ale takto je to bezpečnější – Nenačítáme entitu před update/delete, protože to není třeba • Při editaci 1 entity by to typicky nevadilo, problém při editaci mnoha entit najednou o CrudFacade – Šlo by to i bez Facade, možná by to bylo i designově čistější o Dependency Injection – Standard a základ – Co nejméně kombinovat se singletony, statickými třídami a ručně vytvářenými objekty • Problém obecně u Atributů, MVC - Razor helpery, atd. o Zapouzdření – pouze "hlavní" interfaces a datové objekty jsou public – Třídy v Business vrstvě internal – MVC Controllers a další MVC komponenty ve WebUI musí být public • vlastnost MVC a .NET - např. runtime kompilace Views v samostatné app. doméně
  • 10.
    © 2015 Profinit.All rights reserved. 10 DbContext o Lifecycle – Unit of work – ale jak velkou tu Unit of work uděláme? – PerWebRequest – častý kompromis – Alternativně lze doporučit menší scope: per-facade, per-operation – Pokud váháte, dělejte spíš menší scope, než větší – EF má problémy, když projde ChangeTrackerem stovky a více entit. o Dependency Injection – Objekt jako každý jiný – proč jej neřídit pomocí DI? – Umožní injectovat závislosti, viz. příklad: • IDateTimeFacade • Pro automatické nastavování CreatedAt, ModifiedAt, DeletedAt • Pro testy složitých integrací – možnost uměle posunout čas pomocí testovací implementace • Opatrně potom na používání času na DB serveru – GETDATE(), …. • IAuthenticationService – pro automatické nastavování CreatedBy, ModifiedBy, DeletedBy o Definovat vlastní repository na DbContextem?
  • 11.
    © 2015 Profinit.All rights reserved. Diskuze
  • 12.
    © 2015 Profinit.All rights reserved. Díky za pozornost • 1
  • 13.
    © 2015 Profinit.All rights reserved. Profinit, s.r.o., Tychonova 2, 160 00 Praha 6, +420 224 316 016, www.profinit.eu Společnost PROFINIT je členem nadnárodní skupiny New Frontier Group, která je leadrem v oblasti digitální transformace organizací a firem ve střední a východní Evropě. S více než 2000 zaměstnanci v 17 zemích patří mezi deset největších poskytovatelů ICT služeb v celém CEE regionu a řadí se ke špičce v oblasti vývoje software na zakázku, data managementu, datových skladů a business intelligence. PROFINIT má řadu významných zákazníků z finančního a telekomunikačního sektoru, utilit a státní správy. Společnost se primárně zaměřuje na konzultační služby v oblasti digitální transformace, technologické služby a outsourcing. Podle údajů IDC (2012) patří PROFINIT mezi 5 největších firem v oblasti vývoje software na zakázku v České Republice a je držitelem řady dalších ocenění. Shaping future, delivering results!

Editor's Notes

  • #4 -menší vazba, než DbContext v MVC Controlleru; u velkých APP by byl stejně problém měnit ORM vrstvu -spíš bychom měli mluvit o CQRS
  • #5 -účel vrstev -alternativně lze definovat samostatná DTO pro Create, Edit i Delete -Person.EmailAddresses -PersonViewModel.DisplayName
  • #6 MappingTests.cs DI – pozor co jde do DB
  • #7 visibility
  • #8 visibility
  • #10 CrudFacade – null v konstruktoru pro danou operaci jí zakáže
  • #11 -riziko starých dat z jiných operací v Contextu -riziko paralel. updatu jiným requestem (transakcí) – ale to znamená chybný design (transakce vs. timestamps)
  • #12 UpdatedTrackableFields() Castle factory Castle internal