Frage

Ich schreibe eine Anwendung mit DDD-Techniken. Dies ist mein erster Versuch eines DDD-Projekt. Es ist auch mein erstes Greenfield-Projekt, und ich bin der einzige Entwickler. Ich habe das Domänenmodell und Benutzeroberfläche konkretisiert. Jetzt fange ich an der Persistenz-Schicht. Ich beginne mit einem Gerät zu testen, wie üblich.

[Test]
public void ShouldAddEmployerToCollection()
{
    var employerRepository = new EmployerRepository();
    var employer = _mockery.NewMock<Employer>();

    employerRepository.Add(employer);
    _mockery.VerifyAllExpectationsHaveBeenMet();
}

Wie man sehen kann ich keine Erwartungen für das Add geschrieben haben () Funktion. Ich habe bis hierher und realisierte ich habe nicht auf einem bestimmten Datenbank-Anbieter noch abgewickelt. In der Tat bin ich nicht einmal sicher, ob es für einen DB-Engine an alle Anrufe. Flat-Dateien oder XML kann ebenso sinnvoll sein. Also ich bin links fragen, was mein nächster Schritt sein sollte.

Soll ich eine weitere Ebene der Abstraktion hinzufügen ... sagen einen Datastore-Schnittstelle oder suchen Sie nach einer vorhandenen Bibliothek, die bereits die Arbeit für mich getan hat? Ich möchte auf eine bestimmte Datenbank-Technologie zu binden, das Programm zu vermeiden, wenn ich kann.

War es hilfreich?

Lösung

Mit Ihren Anforderungen, die nur Abstraktion Sie wirklich brauchen, ist eine Repository-Schnittstelle, die Semantik grundlegende CRUD hat, so dass Sie Ihre Kundennummer und die Zusammenarbeit Objekte nur mit IEmployerRepository Objekten anstatt konkreten Repositories umgehen. Sie haben ein paar Optionen für den Gang über das:

1) Nicht mehr Abstraktionen . Gerade bauen die konkrete Repository in Ihrer Top-Level-Anwendung, wo Sie es brauchen:

IEmployeeRepository repository = new StubEmployeeRepository();
IEmployee           employee   = repository.GetEmployee(id);

Ändern, dass in einer Million Plätzen wird alt werden, so ist diese Technik nur dann wirklich rentabel für sehr kleine Projekte.

2) Erstellen Sie Repository Fabriken in Ihrer Anwendung verwenden:

IEmployeeRepository repository = repositoryFactory<IEmployee>.CreateRepository();
IEmployee           employee   = repository.GetEmployee(id);

Sie können die Repository Fabrik in die Klassen übergeben, die es benutzen werden, oder Sie können eine Anwendungsebene statische Variable erstellen, um es zu halten (es ist ein Singleton, was schade ist, aber ziemlich gut begrenzt).

3) Verwenden einer Abhängigkeitsinjektionsbehälter (im Wesentlichen ein Allzweck- Fabrik- und Konfigurationsmechanismus):

// A lot of DI containers use this 'Resolve' format.
IEmployeeRepository repository = container.Resolve<IEmployee>();
IEmployee           employee   = repository.GetEmployee(id);

Wenn Sie DI-Container noch nicht verwendet haben, gibt es viele gute Fragen und Antworten zu ihnen hier auf SO (wie Welche C # /. nET Dependency Injection-Frameworks lohnt ein Blick in? und Datenzugriff, Unit-Tests, Dependency Injection ), und Sie würden auf jeden Fall wollen Martin Fowler Inversion of Control Container und das Einspritzmuster Abhängigkeit).

Andere Tipps

An einem gewissen Punkt werden Sie einen Anruf, was Ihr Repository machen müssen, um mit den Daten zu tun. Wenn Sie Ihr Projekt fangen dann ist es wahrscheinlich am besten, es so einfach wie möglich zu halten, und nur Abstraktionsschichten bei Bedarf hinzufügen. Einfach zu definieren, was Ihre Repositories / DAOs sind in diesem Stadium wahrscheinlich genug ist.

Normalerweise

, das Repository / Repositories / DAOs sollten wissen, über die Details der Implementierung von denen Datenbank oder ORM Sie sich entschieden haben, zu verwenden. Ich erwarte, dass das ist, warum Sie Repositories in DDD verwenden. Auf diese Weise Ihre Tests können die Repositories verspotten und Agnostiker der Umsetzung sein.

ich eine Blog-Post schrieb das Repository-Muster oben auf NHibernate an der Umsetzung, halte ich es für Sie, unabhängig davon profitieren werden, ob Sie NHibernate verwenden oder nicht.

anlegen gemeinsame generische und erweiterbare NHiberate Repository

Eine Sache, die ich mit Persistenzschichten gefunden haben, ist sicher zu stellen, dass es eine Stelle, wo Sie tun Abstraktion beginnen. Wenn Sie Datenbank wächst, müssen Sie beginnen sharding Umsetzung und es sei denn, es gibt bereits eine Abstraktionsschicht bereits verfügbar ist, kann es schwierig sein, ein später hinzuzufügen.

Ich glaube, Sie nicht noch eine weitere Schicht nur zum Zweck der Unit-Tests unter den Repository-Klassen hinzufügen sollten, besonders, wenn Sie Ihre Persistenztechnologie nicht gewählt haben. Ich glaube nicht, können Sie eine Schnittstelle noch genauer als „repository.GetEmployee (id)“ erstellen, ohne Details über die Persistenz Verfahren auszusetzen.

Wenn Sie wirklich erwägen, mit flachen Text- oder XML-Dateien, ich glaube, die beste Option mit der Repository-Schnittstelle Abstraktion zu halten ist. Aber wenn Sie sich entschieden haben, Datenbanken zu verwenden, und Sie sind nur nicht sicher über den Verkäufer, ein ORM-Tool könnte der Weg zu gehen.

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