Ich habe über POCO (Plain Old CLR Object) für eine Weile gelesen, aber immer noch nicht finden können, den wirklichen Mehrwert der Verwendung von es anstelle der Verwendung der automatisch generierten partiellen Klassen der Entität Framework? Eine weitere Sache ist es am besten, meine Entity-Framework direkt aus der Präsentationsschicht zu verwenden oder eine BLL erstellen wird besser sein?
Antworten
Zu viele Anzeigen?Der Hauptvorteil eines POCO ist, dass Sie ihn an eine Klasse, Bibliothek oder Assembly übergeben können, die nichts über Entity Framework wissen muss, um ihre Aufgabe zu erfüllen.
Erinnern Sie sich an das Prinzip der einzigen Verantwortung - Ihre DAL sollte über EF Bescheid wissen, aber Ihre Domäne nicht, und Ihre Präsentationsschicht auch nicht, da EF sich mit dem Datenzugriff befasst und diese Schichten nicht. Wenn Sie von EF generierte Klassenobjekte an diese Schichten weitergeben, bedeutet dies im Allgemeinen, dass Sie diesen Schichten EF bekannt machen müssen, was das SRP bricht und es schwieriger macht, diese Schichten isoliert zu testen.
Als Antwort auf Alis weitere Frage in den Kommentaren unten folgt hier eine erweiterte Erklärung.
Bei komplexeren Anwendungen werden Sie die Logik in verschiedene Bereiche aufteilen wollen - Datenzugriff, Geschäftslogik, Präsentation (und vielleicht noch viel mehr).
Da sich das Entity Framework mit dem Datenzugriff befasst, ist es in der Datenzugriffsschicht angesiedelt - hier werden Sie kaum einen Unterschied zwischen POCOs und von EF generierten Klassen feststellen. Das ist in Ordnung, denn diese Schicht weiß bereits über Entity Framework Bescheid.
Wenn Sie dies mit von EF generierten Klassen tun, muss Ihre Geschäftslogikschicht auch über Entity Framework Bescheid wissen, da die EF-Klassen auf viele Dinge angewiesen sind, die EF speziell bereitstellt. Dadurch wird die Isolation aufgehoben, die Ihre Geschäftslogikschicht haben sollte. Sie brauchen diese Isolation, um Unit-Tests korrekt durchführen zu können, indem Sie bekannte Daten von einer gefälschten Datenzugriffsschicht in die Klasse injizieren, was unglaublich schwierig ist, wenn Sie die Geschäftslogikschicht über EF wissen lassen.
Mit Unit-Tests sollten Sie die Funktionalität der Schichten testen, nicht die Funktionalität von Drittanbieter-Bibliotheken - aber mit EF testen Sie am Ende einen Großteil der EF-Funktionalität oder Ihre eigene Funktionalität, die sich sehr stark auf die von EF stützt. Das ist nicht gut und kann Fehler oder Probleme verschleiern.
Wenn Sie die Abhängigkeit der Geschäftslogik von den mit EF generierten Klassen aufheben, können Sie die Schicht beliebig weit von der Datenzugriffsschicht entfernen - Sie können sie sogar hinter einen Webdienst stellen, und sie wäre völlig zufrieden. Dies ist jedoch nur mit POCOs möglich, nicht aber mit von EF generierten Klassen.
POCOs kommen vor allem bei großen, komplexen, mehrschichtigen Anwendungen zur Geltung - wenn Sie Ihre Anwendung nicht schichten, werden Sie imho keine großen Vorteile sehen.
All dies ist meine Meinung, und ich bin nur ein Programmierer mit Erfahrung - ich bin kein Programmier-Rockstar, so dass andere Kommentatoren meine Antworten vielleicht noch erweitern möchten...
Die wirklichen Vorteile von POCO liegen darin, dass Sie Code First und EF Migrations verwenden können. Wenn Sie nicht zuerst Code verwenden möchten, können Sie die vom Designer generierten Klassen verwenden.
Wenn Sie eine große Anwendung haben, sollten Sie eine separate BLL erstellen, aber wenn Ihre Anwendung sehr klein ist, können Sie wahrscheinlich direkt mit den EF-Klassen in der Präsentationsschicht arbeiten.
Die Verwendung von POCO-Klassen in einem ORM ermöglicht es Ihnen, Tests für diesen Code auf einfachere Weise zu erstellen. Außerdem können Sie eine Abstraktionsschicht zwischen Ihren Modellobjekten (den POCO-Klassen) und dem Datenzugriffscode einrichten, so dass Sie bei Bedarf den Datenzugriffscode austauschen können (z. B. EF gegen NHibernate).
Ich habe in der Vergangenheit mit dem POCO-Modell gearbeitet und kann Ihnen sagen, dass es für große Unternehmensprojekte und große Entwicklerteams nützlich ist, bei denen häufig Änderungen am Modell vorgenommen werden und bei denen das von EF standardmäßig verwendete monolithische Dateimodell nicht gut skalierbar ist. Die Vorteile bei kleinen Projekten oder bei der schnellen Anwendungsentwicklung sind schwer zu erkennen.
TLDR-Version: Wenn Sie sich fragen, was die Vorteile von POCO und Code First sind, werden Sie wahrscheinlich nichts davon haben.