2012-04-14 8 views
2

Ich möchte EF Code zuerst verwenden. Ich arbeite mit einem Repository-Muster. Und ich möchte eine n-Tier-Architektur implementieren. Was ich wirklich will, ist TDD zu verwenden, aber ich bekomme ein Problem mit aggregierten Routen. Mein Problem ist das ...Einige Fragen zur Verwendung von Code First, Repository Pattern und n-Tier?

Ich habe ein Blog-Objekt. Von diesem Blogobjekt können verknüpfte Dateien hinzugefügt werden. Groß. Also habe ich im Wesentlichen 1 aggregierte Wurzel, für die ich mein Repository erstelle, und dann muss ich einige Methoden hinzufügen, die es mir erlauben, assoziierte Dateien dem Blog hinzuzufügen. Aber wo soll ich das hinstellen? Es ist eine Datenzugriffsschicht, also möchte ich es wirklich dort. Aber um ehrlich zu sein, ist es auch eine Herausforderung für die Geschäftslogik. Ein Teil des Produkts ist es, assoziierte Dateien hinzufügen zu können. Also sollte ich die Logik hinzufügen, um Assoc-Dateien in der DAL oder der BLL hinzuzufügen?

Hoffe, dass jemand mir einige Richtlinien geben kann.

+2

Diese Frage klingt wie Buzzword Bingo :) – ThiefMaster

Antwort

0

Ich denke, du meinst DDD statt TDD, weil das, was du gesagt hast, im Zusammenhang mit TDD wenig Bedeutung hat.

Sie müssen sitzen und überlegen, was eine Datei für Ihr System bedeutet, gibt es irgendwelche Regeln, die Dateien und Beiträge verbindet. Zum Beispiel, wenn wir einen Beitrag löschen, was mit Dateien haben sollte? Löschen wir sie auch? Können wir die gleiche Datei mehreren Beiträgen hinzufügen? Du sitzt, denkst und sammelst Wissen über deine Akte, dann entscheidest du, ob es einen Platz verdient, der dir in deiner Domain vorgestellt wird.

Einige Beispieldomäne kann ich mir vorstellen:

public class Post 
{ 
    private List<File> _files; 
    public IEnumerable<File> AssociatedFiles {get {return _files;}} 
    public void AssociateFile(File file){//...} 
    public void DisassociateFile(File file){//...} 

    //It doesn't delete it just do some logic. Maybe we can't delete this post and need to throw exception or whatever logic you need 
    public void Delete() 
    { 
     foreach (File file in AssociatedFiles) DisassociateFile(file); 
    } 
} 

public class File 
{ 
    public String Url; 
    public DateTime Created; 
    public DateTime Modified; 
} 

public class PostRepository 
{ 
    public void Delete(Post post) 
    { 
     post.Delete(); 
     DbContext<Post>.Delete(post); //I Don't remember EF syntax for this 
     DbContext.SaveChanges(); 
    } 
} 

Update: Lassen Sie uns weiter ...

Nach 5 Minuten auf Sie Domäne des Denkens ich descovered, dass meine ersten Entwurf wichtige Konzepte vermisst (Wie immer bei DDD schabt man Wissen Stück für Stück).

Wer ist verantwortlich für das Hochladen von Dateien? Kann Benutzer eine Datei zuordnen, die er bereits hochgeladen hat, kann er eine neue Datei (unuplodiert) hinzufügen, um sie zu veröffentlichen? Kann er diese Dinge mischen? Das sind wichtige Fragen, wieder müssen Sie darüber nachdenken und Ihr System entwerfen.

+0

Okay, ich sehe jetzt, wie man das macht. Ich füge einfach hinzu und lösche die AssocFiles über das Blog Repo, da dies im Wesentlichen die aggregierte Route ist – Exitos

1

Sie sprechen über Repositories und Aggregatwurzeln, also nehme ich an, Sie sagen, dass Sie DDD tun wollen. In DDD sollten Sie ein Domänenmodell haben, das ein Modell sein sollte, das Sie mit den Benutzern des Systems entwickeln. In jedem Fall sollte es aus Konzepten bestehen, die ein normaler Benutzer verstehen sollte. Wenn also ein Benutzer einen Blog als etwas betrachtet, dem Dateien zugeordnet sind, und diese Dateien dem Blog hinzugefügt werden können, gehören die zugehörigen Dateien zu Ihrem Domänenmodell und Ihre Blog-Objekte sollten eine add-Methode haben. Meine Vermutung ist, dass Ihre BLL ist, wo Sie diese verknüpften Dateien platzieren möchten.

1

Zunächst können Sie eine Aggregatwurzel erst identifizieren, wenn Sie den beschränkten Kontext kennen. Ohne eine klare BS gibt es keine AR. Ein ANy-Objekt kann abhängig vom Kontext ein AR sein. Ich kenne Ihre Domain nicht, daher nehme ich die Informationen, die ein Blog zum Hinzufügen von Dateien benötigt, als gültig an. SO ist das Hinzufügen von Funktionalität in AR.

Das Repository behandelt alles im Zusammenhang mit der Persistenz, die in der Datenbank gespeichert wird. In diesem Fall sollte es eine einzige Methode enthalten, nicht weniger, nicht mehr.

public interface IBlogFilesRepository 
{ 
    void Save(Blog); 
} 

Sie setzen IMMER die Domäne/Geschäftslogik in die Domäne/BL-Schicht. Die DAL behandelt nur das Speichern/Laden in der Datenbank, sie hat kein Problem im Umgang mit Domänenverhalten.