(Wenn Sie keine Lust zum Lesen haben, gibt es eine Zusammenfassung am Ende :-)
Auch ich habe mit der genauen Definition von Anwendungsdiensten gerungen. Obwohl Vijays Antwort vor einem Monat sehr hilfreich für meinen Denkprozess war, bin ich jetzt mit einem Teil davon nicht einverstanden.
Weitere Ressourcen
Es gibt nur sehr wenige Informationen über Anwendungsdienste. Themen wie Aggregate Roots, Repositories und Domänendienste werden ausführlich diskutiert, aber Anwendungsdienste werden entweder nur kurz erwähnt oder ganz ausgelassen.
Der MSDN Magazine-Artikel Einführung in das domänengesteuerte Design beschreibt Anwendungsdienste als eine Möglichkeit, Ihr Domänenmodell für externe Clients zu transformieren und/oder freizugeben, z. B. als WCF-Dienst. So beschreibt auch Vijay Anwendungsdienste. Aus dieser Sicht sind Anwendungsdienste eine Schnittstelle zu Ihrer Domäne.
Jeffrey Palermos Artikel zur Onion-Architektur (Teil eins, zwei und drei) sind lesenswert. Er behandelt Anwendungsdienste als Anwendungsebenenkonzepte, wie z. B. eine Benutzersitzung. Obwohl dies meiner Vorstellung von Anwendungsdiensten näher kommt, entspricht es immer noch nicht meinen Gedanken zu diesem Thema.
Meine Gedanken
Ich denke inzwischen an Anwendungsdienste als Abhängigkeiten, die von der Anwendung bereitgestellt werden. In diesem Fall könnte die Anwendung eine Desktopanwendung oder ein WCF-Dienst sein.
Domäne
Zeit für ein Beispiel. Sie starten mit Ihrer Domäne. Alle Entitäten und alle Domänendienste, die nicht von externen Ressourcen abhängen, sind hier implementiert. Alle Domänenkonzepte, die von externen Ressourcen abhängen, werden über eine Schnittstelle definiert. Hier ist eine mögliche Lösungsstruktur (Projektname in fett):
Meine Lösung
- **Mein.Produkt.Kern** (My.Product.dll)
- Domänendienste
IWechselkursdienst
Produkt
Produktfabrik
IProduktrepository
Die Klassen Produkt
und Produktfabrik
wurden im Kern-Assembly implementiert. Das IProduktrepository
wird wahrscheinlich von einer Datenbank unterstützt. Die Implementierung davon geht die Domäne nichts an und wird daher durch eine Schnittstelle definiert.
Fürs Erste konzentrieren wir uns auf den IWechselkursdienst
. Die Geschäftslogik dieses Dienstes wird von einem externen Webservice implementiert. Sein Konzept gehört jedoch immer noch zur Domäne und wird durch diese Schnittstelle repräsentiert.
Infrastruktur
Die Implementierung der externen Abhängigkeiten ist Teil der Anwendungsinfrastruktur:
Meine Lösung
+ **Mein.Produkt.Kern** (My.Product.dll)
- **Mein.Produkt.Infrastruktur** (My.Product.Infrastructure.dll)
- Domänendienste
XEWechselkursdienst
SqlServerProduktrepository
XEWechselkursdienst
implementiert den Domaindienst IWechselkursdienst
, indem er mit xe.com kommuniziert. Diese Implementierung kann von Anwendungen genutzt werden, die Ihr Domänenmodell verwenden, indem sie das Infrastruktur-Assembly einschließen.
Anwendung
Beachten Sie, dass ich noch nicht über Anwendungsdienste gesprochen habe. Wir werden uns diese jetzt ansehen. Angenommen, wir möchten eine IWechselkursdienst
-Implementierung bereitstellen, die einen Cache für schnelle Nachschlagen verwendet. Der Umriss dieser Dekoratorklasse könnte so aussehen.
public class CachingWechselkursdienst : IWechselkursdienst
{
private IWechselkursdienst dienst;
private ICache cache;
public CachingWechselkursdienst(IWechselkursdienst dienst, ICache cache)
{
this.dienst = dienst;
this.cache = cache;
}
// Implementierung, die den bereitgestellten Dienst und Cache nutzt.
}
Bemerken Sie den ICache
-Parameter? Dieses Konzept gehört nicht zu unserer Domäne, daher ist es kein Domänendienst. Es ist ein Anwendungsdienst. Es ist eine Abhängigkeit unserer Infrastruktur, die von der Anwendung bereitgestellt werden kann. Lassen Sie uns eine Anwendung einführen, die dies zeigt:
Meine Lösung
- **Mein.Produkt.Kern** (My.Product.dll)
- Domänendienste
IWechselkursdienst
Produkt
Produktfabrik
IProduktrepository
- **Mein.Produkt.Infrastruktur** (My.Product.Infrastructure.dll)
- Anwendungsdienste
ICache
- Domänendienste
CachingWechselkursdienst
XEWechselkursdienst
SqlServerProduktrepository
- **Mein.Produkt.WcfService** (My.Product.WcfService.dll)
- Anwendungsdienste
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
All dies kommt in der Anwendung wie folgt zusammen:
// Richten Sie alle Abhängigkeiten ein und registrieren Sie sie im IoC-Behälter.
var dienst = new XEWechselkursdienst();
var cache = new MemcachedCache();
var cachingDienst = new CachingWechselkursdienst(dienst, cache);
ServiceLocator.For().Use(cachingDienst);
Zusammenfassung
Ein vollständige Anwendung besteht aus drei Hauptebenen:
- Domäne
- Infrastruktur
- Anwendung
Die Domänenschicht enthält die Domänenentitäten und eigenständigen Domänendienste. Alle domänenbezogenen Konzepte (dazu gehören Domänendienste, aber auch Repositories), die von externen Ressourcen abhängen, werden über Schnittstellen definiert.
Die Infrastrukturschicht enthält die Implementierung der Schnittstellen aus der Domänenschicht. Diese Implementierungen können neue nicht-domänenbezogene Abhängigkeiten einführen, die von der Anwendung bereitgestellt werden müssen. Dies sind die Anwendungsdienste und werden über Schnittstellen repräsentiert.
Die Anwendungsschicht enthält die Implementierung der Anwendungsdienste. Die Anwendungsschicht kann auch zusätzliche Implementierungen von Domänenschnittstellen enthalten, wenn die Implementierungen aus der Infrastrukturschicht nicht ausreichen.
Obwohl diese Perspektive möglicherweise nicht mit der allgemeinen Definition von DDD-Diensten übereinstimmt, trennt sie die Domäne von der Anwendung und ermöglicht es Ihnen, das Domänen- (und Infrastruktur-)Assembly zwischen mehreren Anwendungen zu teilen.
0 Stimmen
Fühlen Sie sich frei, dies zu überprüfen: youtu.be/MfEpw2WXXyk