Verbinden einer Geschäftsschicht und eines Repositorys mithilfe des Arbeitseinheitsmusters


8

Meine Frage ähnelt der zum Stapelüberlauf: Wie kann die Arbeitseinheit / die Repositorys in der Geschäftsschicht richtig verwendet werden?

Szenario:

  • .Net-Lösung
  • IRepository zum Abrufen von Objekten aus der Datenbank
  • IUnitOfWork wurde verwendet, um Transaktionen über mehrere Repositorys hinweg zuzulassen

Das macht für mich Sinn und ich habe etwas in diese Richtung implementiert, das gut funktioniert. Jetzt möchte ich eine Geschäftslogikschicht einführen und habe Probleme, die drei Elemente (BLL, UnitOfWork und Repository) in meinem Kopf zu organisieren.

Mein Verständnis:

  • Repository - Datenabruf, Manipulation
  • UnitOfWork - Persistenz
  • BLL - Logik, die für das Geschäft relevant ist ('reale Welt') (mag diesen Begriff nicht!)

Angenommen, wir haben ein ASP.Net MVC-Frontend.

Wie sieht eine BLL aus und wie sieht der MVC-Controller aus, der sie verwendet?

Als Referenz: Ich frage mich, ob meine IUnitOfWork / IRepository-Implementierung möglicherweise die Ursache für meine Verwirrung ist.

public class IRepository<T> 
{
    private IObjectSet<T> objSet;
    public IRepository<T>(IUnitOfWork uow)
    {
        objSet = uow.CreateObjectSet<T>();
    }

    public IQueryable<T> Add(T entity)
    {
        objSet.Add(entity);
    }
    //etc. etc. for delete, attach, getall
}

Wenn ich also eine BLL habe, sollte ich sie an IUnitOfWork übergeben, damit sie damit die benötigten IRepository-Instanzen erstellen kann. Aber woher weiß die BLL (separate DLL vom Frontend), welche Implementierung von IRepository erstellt werden soll?


2
Ich dachte eigentlich, deine Frage wäre in Ordnung. Das Problem ist, dass dies ein unscharfer Bereich ist. Es gibt keinen One True Way ™, um dies zu tun, und niemand möchte Ihnen Vorschläge machen, weil er nicht wissen möchte, dass er es falsch macht ™. Ich persönlich bevorzuge bei kleineren Projekten einen dünneren, datenbankorientierteren Ansatz. All diese Zeremonien sind wirklich für große Unternehmensanwendungen gedacht.
Robert Harvey

Faire Punkte beides und der Fehler liegt dann in meiner Formulierung. Ich war an persönlichen Meinungen interessiert, dh "so würde ich persönlich damit umgehen".
Glosrob

Antworten:


5

Bitte beachten Sie, dass ich nur geringe Erfahrung mit dem .NET Framework habe und dass sich diese Antwort nur auf den Architekturteil Ihrer Frage bezieht.

Soweit ich es verstanden habe, wenden Sie in Ihrer Anwendung grundsätzlich die folgenden Architekturmuster an:

Ebenen: Es scheint, dass Sie eine Persistenzschicht (Repository-Muster), eine Geschäftslogikschicht und eine Ansichtsebene haben.

Model-View-Controller: Dieses Muster wird mit ASP.NET MVC in der Ansichtsebene angewendet.

Ich denke, die Frage ist: Wie sieht eine BLL aus und wie sieht der MVC-Controller aus, der sie verwendet?

Zuallererst ist diese Architektur für große Unternehmensanwendungen gedacht, wie Robert Harvey in seinem Kommentar zu Ihrer Frage erwähnt hat. Für solche Systeme ist charakteristisch, dass auf die Domänenlogik (die Sie in der Geschäftslogikschicht gekapselt haben) über verschiedene Schnittstellen zugegriffen werden sollte.

Betrachten Sie zum Beispiel Twitter - Twitter könnte eine Geschäftslogikschicht haben, die Dienste zum Registrieren und Validieren von Benutzern, zum Posten von Tweets und vielem mehr bietet. Zusätzlich zu dieser Geschäftslogikschicht können mehrere andere Komponenten in der Ansichtsschicht vorhanden sein, z. B. eine Webschnittstelle und eine Webdienstkomponente. Da die gesamte Geschäftslogik in der Geschäftslogikschicht gekapselt ist, können Sie dem DRY-Prinzip folgen und die Wartbarkeit und andere Qualitätsmerkmale verbessern.

Um auf Ihre Frage zurückzukommen, sollten Sie die Geschäftslogik und den Datenzugriff in der BLL zusammenfassen. Der Controller (Think MVC) sollte die BLL verwenden und keinen direkten Zugriff auf die Datenbank haben. Betrachten Sie die Ansichtsebene als Schnittstelle zu Ihrer Anwendung.

Wenn ich also eine BLL habe, sollte ich sie an IUnitOfWork übergeben, damit sie damit die benötigten IRepository-Instanzen erstellen kann. Aber woher weiß die BLL (separate DLL vom Frontend), welche Implementierung von IRepository erstellt werden soll?

Die BLL sollte wissen, welches Repository (Datenquelle?) Sie verwendet. Die obigen Ebenen sollten dies nicht steuern. Betrachten Sie die Ansichtsebene erneut nur als Schnittstelle zu Ihrer Geschäftslogik.

Wenn Sie den Overhead einer Geschäftslogikschicht nicht benötigen, können Sie diese auch ausschließlich für den Datenzugriff in Form von Datenzugriffsobjekten verwenden .

Ich hoffe, dies hat dazu beigetragen, die Verantwortlichkeiten der verschiedenen Komponenten zu klären.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.