Frage

In der realen Welt können Controller möglicherweise benötigen, um Daten aus einer Vielzahl von Datenbanktabellen und anderen Datenspeichern zu verwenden. Zum Beispiel:

[Authorize]
    public class MembersController : Controller
    {
        ICourseRepository repCourse;
        IUserCourseRepository repUserCourse;
        IMember member;
        public MembersController(ICourseRepository repCourse, IUserCourseRepository repUserCourse, IMember member)
        {
            this.repCourse = repCourse;
            this.repUserCourse = repUserCourse;
            this.member = member;
        }

So:

  1. Soll ich ein Repository für jede Tabelle?

  2. Ich denke, das ist, wo das Konzept des agregates ins Spiel kommt? Soll ich ein Repository pro Aggregat?

  3. füge ich nur so viele Repositorys, wie ich an den Konstruktor des Controllers müssen?

  4. Ist das ein Zeichen dafür, dass mein Design ist falsch?

Hinweis:

Die IMember Schnittstelle stellt im Wesentlichen ein Hilfsobjekt, dass Puts ein schönes Gesicht auf dem Membership Provider. Das heißt, es setzt den gesamten Code an einem Ort. Zum Beispiel:

        Guid userId;
        public Guid UserId
        {
            get
            {
                if (userId == null)
                {
                    try
                    {
                        userId = (Guid) Membership.GetUser().ProviderUserKey;
                    }
                    catch { }
                }
                return userId;
            }
        }

Ein Problem mit diesem ist das Caching sicher diese Art von Ausgabe. Ich kann eine andere Frage fühlen kommen auf.

EDIT:

Ich benutze Ninject für DI und bin ziemlich auf der ganzen DI verkauft, DDD und TDD Sache. Naja, so ungefähr. Ich versuche auch, ein Pragmatiker ...

zu sein
War es hilfreich?

Lösung

  

1. Soll ich ein Repository für jede Tabelle?

Wahrscheinlich nicht. Wenn Sie ein Repository pro Tisch haben, tun Sie im Wesentlichen Active Record. Ich habe auch lieber persönlich zu vermeiden, dass diese Klassen „Repository“ wegen der Verwirrung fordern, die zwischen Domain Driven Design Konzept eines „Repository“ und der Klasse-per-Tabelle „Repository“, die zu haben scheint häufig verwendet mit Linq2SQL, SubSonic auftreten können etc. und viele MVC-Tutorials.

  

2. Ich denke, das ist, wo das Konzept des agregates ins Spiel kommt? Soll ich ein Repository pro Aggregat?

Ja und ja. Wenn Sie vorhaben, diesen Weg zu gehen.

  

'3.' Muss ich nur hinzufügen, wie viele Repositorys, wie ich an den Konstruktor des Controllers müssen?

Ich lasse nicht meine Controller direkt meine Repositories berühren. Und ich lass nicht zu, meine Ansichten direkt meine Domain Klassen berühren, auch nicht.

Stattdessen meine Controller haben Abfrageklassen, die für die Rückgabe Ansicht Modelle verantwortlich sind. Die Abfrageklassen Referenz was Repositories (oder andere Datenquellen) sie müssen die Ansicht Modell kompilieren.

Andere Tipps

Nun @awrigley, hier ist mein Rat:

F: Soll ich ein Repository für jede Tabelle verwenden

. A: Nein, wie Sie auf Anfrage genannten 2. Verwendung ein Repository pro Aggregat und führen die Operationen auf Aggregat root nur

F: Muss ich nur hinzufügen, wie viele Repositorys, wie ich an den Konstruktor des Controllers benötigen

A: Ich denke, ich ist mit IoC und Konstruktor-Injektion, na ja, in diesem Fall sicher, dass nur Sie echte Abhängigkeiten bestehen. dieser Beitrag können Ihnen helfen, zu diesem Thema entscheiden.

(! Pst, dass leerer Haken ist keine schöne Sache !!);)

Cheers!

Dies alles hängt davon ab, wie „Domain Driven Design“ Ihr sein würde. Wissen Sie, was ein Aggregat Root ist? Die meiste Zeit ein generisch typisierten Repository, das kann alles tun, wird Ihre grundlegenden CRUD ausreichen. Es ist nur, wenn Sie dicke Modelle mit Rahmen und Grenzen beginnen zu müssen, dass diese beginnt Rolle zu spielen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top