myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » ER-Mapper in einer 3-Layer-Architektur
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

ER-Mapper in einer 3-Layer-Architektur

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
dust258 dust258 ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.12.2009
Beiträge: 30


dust258 ist offline

ER-Mapper in einer 3-Layer-Architektur

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Leute,
ich arbeite im Moment an einem Testprojekt für eine 3-Layer Architektur. Es handelt sich dabei zunächst um eine kleine Adressverwaltung.

Jede Schicht greift auf die darunterliegende über ein Interface zu. Die Business-Schicht leitet die Objekte aus dem Data-Layer weiter. Hier (in der Business-Schicht) sollten später Validierung und Filterung stattfinden. Durch das Save im Datalayer werden alle Änderungen in die Datenbank übernommen.

C#-Code:
    public interface IBusinessRepositoryAdressen
    {
        IQueryable<IAdressen> Get();

        Boolean Save();

        IAdressen Create();
    }

C#-Code:
    public interface IDataRepositoryAdressen
    {
        IQueryable<IAdressen> Get();

        void Save();

        IAdressen Create();
        void Add(IAdressen adr);
        void Delete(IAdressen adr);
    }

C#-Code:
    public interface IAdressen
    {
        int ID { get; set; }
        string Name { get; set; }
        string Vorname { get; set; }
        string Strasse { get; set; }
        string PLZ { get; set; }
        string Ort { get; set; }
    }

Im Data-Layer werden die Adressobjekte aus der Datenbank mit Hilfe des Entity-Frameworks erzeugt:

C#-Code:
        private static IQueryable<IAdressen> Get(AdressenEntities ae)
        {
            IQueryable<IAdressen> result = from adresse in ae.Adressen
                                           select adresse;
            return (IQueryable<IAdressen>)result;
        }

Die durch das EF erzeugten Objekte werden also in allen Schichten verwendet (durch das Inteface haben die oberen Schichten allerdings keinen Zugriff auf die EF-Logik.
Ich bin mir allerdings nicht sicher ob eine so enge Bindung das das EF bei einer größeren Anwendung zu Problemen führen könnte. Viele Quellen raten davon ab die Datenbankentitäten aus dem O/R-Mapper in den oberen Schichten zu verwenden.

Nur was stellt die Alternative dar? Durch mein derzeitiges Konzept kann (dank IQueryable) die Filterung der Daten in der Business-Schicht erfolgen. Da es sich um eine Neuentwicklung handelt entsprechen meine Business-Objekte 1:1 den Datenbanken. Entsprechende Unterschiede kann ich immer noch durch eine partielle Klasse ausgleichen.

Nach meinem jetzigen Verständnis müsste ich ein Business-Adressen-Objekt erzeugen, welches fast 1:1 der vom EF erzeugten Klasse entspricht. Dann müsste ich (in meinem Fall in der Business-Schicht) nach dem Filtern, aus den Datenbankentitäten die Business-Adressen-Objekte erzeugen (Mappen).

Das erscheint mir allerdings im Anbetracht des geringen Nutzen sehr viel Arbeit. Damit meine ich nicht nur aus Code-Sicht sondern auch den Performance-Verlust der durch das Mappen entsteht.

Wie sind euere Erfahrungen? Kapselt/Mappt ihr eure Datenbankentitäten?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dust258 am 04.05.2012 11:02.

04.05.2012 10:24 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 5.349
Entwicklungsumgebung: VS 2010 sup{Editionen}
Herkunft: Waidring / Tirol


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo dust258,

Zitat:
Nur was stellt die Alternative dar?

POCOs. Das sind normale CLR-Klassen ohne eine Abhängigkeit zu einem O/R-Mapper zu haben, der O/R-Mapper weiß jedoch wie er damit umzugehen hat.
Speziell beim EF wurde in Version 4.1 hierfür einiges verbessert. Siehe dazu  Using DbContext in EF 4.1 Part 1: Introduction and Model ff.

mfG Gü
04.05.2012 11:44 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 47.474
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo dust258,

der Entkoppelung und Unabhängigkeit der Schichten steht hier KISS und YAGNI entgegen, so dass es kaum eine allgemeingültige Antwort auf deine Frage nach der besten Vorgehensweise gegeben wird.

herbivore
04.05.2012 12:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dust258 dust258 ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.12.2009
Beiträge: 30

Themenstarter Thema begonnen von dust258

dust258 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die Antworten!
@herbivore: Stimmt, aber ich solle die Möglichkeiten schon kennen um einschätzen zu können ob sie nötig sind. Daher das Testprojekt ^^

@gfoidl: Das sieht sehr gut aus, ich werde mich mal einarbeiten.
04.05.2012 13:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Jahr.
Der letzte Beitrag ist älter als ein Jahr.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 19.05.2013 05:07