Domain Driven Design: Domain Service, Anwendungsservice

268

Kann jemand den Unterschied zwischen Domänen- und Anwendungsdiensten anhand einiger Beispiele erklären? Und wenn ein Dienst ein Domänendienst ist, würde ich die tatsächliche Implementierung dieses Dienstes in die Domänenassembly einfügen und wenn ja, würde ich auch Repositorys in diesen Domänendienst einfügen? Einige Infos wären wirklich hilfreich.

Chris
quelle

Antworten:

356

Es gibt drei Varianten von Diensten : Domänendienste , Anwendungsdienste und Infrastrukturdienste .

  • Domänendienste : Verkapselt Geschäftslogik , die natürlich nicht in ein Domänenobjekt passt und KEINE typischen CRUD-Operationen sind - diese würden zu einem Repository gehören .
  • Anwendungsdienste : Werden von externen Verbrauchern verwendet, um mit Ihrem System zu kommunizieren (denken Sie an Webdienste ). Wenn Verbraucher Zugang zu CRUD-Operationen benötigen, wären sie hier exponiert.
  • Infrastrukturdienste : Werden verwendet, um technische Probleme (z. B. MSMQ, E-Mail-Anbieter usw.) zu abstrahieren.

Es ist sinnvoll, Domänendienste zusammen mit Ihren Domänenobjekten zu behalten - sie konzentrieren sich alle auf die Domänenlogik. Und ja, Sie können Repositorys in Ihre Services einfügen.

Anwendungsdienste verwenden normalerweise sowohl Domänendienste als auch Repositorys, um externe Anforderungen zu bearbeiten.

Ich hoffe, das hilft!

Vijay Patel
quelle
2
Wo würden Sie die Befehle und Abfragen von CQRS ablegen? Welcher Dienst generiert sie und welcher Dienst behandelt sie?
Inf3rno
5
Ich denke, Application Services sollten unabhängig von technischen Details wie "Web Services" sein, sie werden von solchen Services verwendet. Siehe Dienste in Domain-Driven Design
Deamon
1
@prograhammer - Ein Beispiel für einen Domain-Service könnte FundsTransferService sein, bei dem das Domain-Modell ein Bankkonto ist. Die Übertragung kann eine Geschäftslogik aufweisen, die nicht direkt in ein Kontoobjekt passt (aus dem Evans DDD-Buch entnommen).
BornToCode
Nehmen wir zum Beispiel an, Loginuser () wäre ein Beispiel für einen Domänendienst. Wo als getUsers () wäre ein Anwendungsdienst?
filthy_wizard
Beide sind eher Anwendungsdienste, da Authentifizierungs- und häufig auch Autorisierungsentscheidungen nicht zur Kerndomäne gehören.
MauganRa
114

(Wenn Sie keine Lust zum Lesen haben, finden Sie unten eine Zusammenfassung :-)

Auch ich habe mit der genauen Definition von Anwendungsdiensten zu kämpfen. Obwohl Vijays Antwort vor einem Monat für meinen Denkprozess sehr hilfreich war, bin ich mit einem Teil davon nicht einverstanden.

Andere Ressourcen

Es gibt nur sehr wenige Informationen zu Anwendungsdiensten. Themen wie aggregierte Roots, Repositorys und Domänendienste werden ausführlich behandelt, Anwendungsdienste werden jedoch nur kurz erwähnt oder ganz weggelassen.

Der Artikel im MSDN-Magazin Eine Einführung in das domänengesteuerte Design beschreibt Anwendungsdienste als eine Möglichkeit, Ihr Domänenmodell zu transformieren und / oder externen Clients zur Verfügung zu stellen, z. B. als WCF-Dienst. So beschreibt Vijay auch Anwendungsdienste. Aus dieser Sicht sind Anwendungsdienste eine Schnittstelle zu Ihrer Domain .

Jeffrey Palermos Artikel über die Zwiebelarchitektur (Teil eins , zwei und drei ) sind eine gute Lektüre. Er behandelt Anwendungsdienste als Konzepte auf Anwendungsebene , z. B. als Benutzersitzung. Obwohl dies meinem Verständnis von Anwendungsdiensten näher kommt, entspricht es immer noch nicht meinen Gedanken zu diesem Thema.

Meine Gedanken

Ich stelle mir Anwendungsdienste als Abhängigkeiten vor, die von der Anwendung bereitgestellt werden . In diesem Fall kann die Anwendung eine Desktopanwendung oder ein WCF-Dienst sein.

Domain

Zeit für ein Beispiel. Sie beginnen mit Ihrer Domain. Hier werden alle Entitäten und Domänendienste implementiert, die nicht von externen Ressourcen abhängig sind. Alle Domänenkonzepte, die von externen Ressourcen abhängen, werden von einer Schnittstelle definiert. Hier ist ein mögliches Lösungslayout (Projektname fett gedruckt):

Meine Lösung
- My.Product.Core (My.Product.dll)
  - DomainServices
      IExchangeRateService
    Produkt
    ProductFactory
    IProductRepository

Die Klassen Productund ProductFactorywurden in der Kernassembly implementiert. Das IProductRepositoryist etwas, das wahrscheinlich von einer Datenbank unterstützt wird. Die Implementierung ist nicht das Anliegen der Domäne und wird daher durch eine Schnittstelle definiert.

Im Moment konzentrieren wir uns auf die IExchangeRateService. Die Geschäftslogik für diesen Dienst wird von einem externen Webdienst implementiert. Das Konzept ist jedoch immer noch Teil der Domäne und wird durch diese Schnittstelle dargestellt.

Infrastruktur

Die Implementierung der externen Abhängigkeiten ist Teil der Infrastruktur der Anwendung:

Meine Lösung
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
  - DomainServices
      XEExchangeRateService
    SqlServerProductRepository

XEExchangeRateServiceimplementiert den IExchangeRateServiceDomänendienst durch Kommunikation mit xe.com . Diese Implementierung kann von Ihren Anwendungen verwendet werden, die Ihr Domänenmodell verwenden, einschließlich der Infrastrukturassembly.

Anwendung

Beachten Sie, dass ich Anwendungsdienste noch nicht erwähnt habe. Wir werden uns diese jetzt ansehen. Angenommen, wir möchten eine IExchangeRateServiceImplementierung bereitstellen , die einen Cache für schnelle Suchvorgänge verwendet. Der Umriss dieser Dekorateurklasse könnte so aussehen.

public class CachingExchangeRateService : IExchangeRateService
{
    private IExchangeRateService service;
    private ICache cache;

    public CachingExchangeRateService(IExchangeRateService service, ICache cache)
    {
        this.service = service;
        this.cache = cache;
    }

    // Implementation that utilizes the provided service and cache.
}

Beachten Sie den ICacheParameter? Dieses Konzept ist nicht Teil unserer Domain, es ist also kein Domain-Service. Es ist ein Anwendungsdienst . Dies ist eine Abhängigkeit unserer Infrastruktur, die möglicherweise von der Anwendung bereitgestellt wird. Lassen Sie uns eine Anwendung vorstellen, die dies demonstriert:

Meine Lösung
- My.Product.Core (My.Product.dll)
  - DomainServices
      IExchangeRateService
    Produkt
    ProductFactory
    IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
  - ApplicationServices
      ICache
  - DomainServices
      CachingExchangeRateService
      XEExchangeRateService
    SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
  - ApplicationServices
      MemcachedCache
    IMyWcfService.cs
  + MyWcfService.svc
  + Web.config

Dies alles kommt in der Anwendung wie folgt zusammen:

// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);

ServiceLocator.For<IExchangeRateService>().Use(cachingService);

Zusammenfassung

Eine vollständige Anwendung besteht aus drei Hauptschichten:

  • Domain
  • Infrastruktur
  • Anwendung

Die Domänenschicht enthält die Domänenentitäten und eigenständigen Domänendienste. Jegliche Domain - Konzepte (einschließlich Domain - Services, sondern auch Repositories) , die auf externen Ressourcen abhängig sind , werden durch Schnittstellen definiert.

Die Infrastrukturschicht enthält die Implementierung der Schnittstellen aus der Domänenschicht. Diese Implementierungen können neue einführen Nicht-Domain - Abhängigkeiten, die die Anwendung zur Verfügung gestellt werden müssen. Dies sind die Anwendungsdienste und werden durch Schnittstellen dargestellt.

Die Anwendungsschicht enthält die Implementierung der Anwendungsdienste. Die Anwendungsschicht kann auch zusätzliche Implementierungen von Domänenschnittstellen enthalten, wenn die von der Infrastrukturschicht bereitgestellten Implementierungen nicht ausreichen.

Obwohl diese Perspektive möglicherweise nicht mit der allgemeinen DDD-Definition von Diensten übereinstimmt, trennt sie die Domäne von der Anwendung und ermöglicht es Ihnen, die Domänen- (und Infrastruktur-) Assembly für mehrere Anwendungen freizugeben.

Niels van der Rest
quelle
2
@ dario-g: Sie müssten Ihr Domain-Modell aus dem Anforderungsmodell rekonstruieren / neu füllen und das Domain-Modell an den Domain-Service übergeben. Diese Frage kann Ihnen einige Ideen liefern. Wenn nicht, lassen Sie es mich wissen und ich werde sehen, ob ich etwas Zeit habe, um eine Antwort auf die andere Frage hinzuzufügen.
Niels van der Rest
1
@Tiendq: Meinst du die IExchangeRateServiceSchnittstelle? Dies ist ein Domain-Konzept, dh etwas, das in der allgegenwärtigen Sprache Ihres Kunden enthalten ist. Andere Teile Ihrer Domain können von diesem Service abhängen, weshalb seine Schnittstelle in der Domain-Schicht definiert ist. Da die Implementierung jedoch einen externen Webdienst umfasst, befindet sich die implementierende Klasse in der Infrastrukturschicht. Auf diese Weise befasst sich die Domänenschicht nur mit der Geschäftslogik.
Niels van der Rest
4
@Tiendq: In einer traditionellen Schichtarchitektur ist die Infrastruktur normalerweise domänenunabhängig. In der Zwiebelarchitektur (siehe Links in meiner Antwort) implementiert die Infrastruktur die externen Abhängigkeiten der Domäne. Aber ich würde nicht sagen, dass die Infrastruktur von der Domäne abhängt , sondern nur darauf verweist . Ich habe den Begriff "Infrastruktur" aus der Zwiebelarchitektur übernommen, aber "extern" könnte ein besserer Name sein.
Niels van der Rest
1
@Derek: Eines dieser 'Dinge' könnte eine ExchangeRateInstanz sein, die eine Basiswährung, eine Gegenwährung und den Wechselkurswert zwischen diesen beiden Währungen enthält. Diese eng miteinander verbundenen Werte stellen das Wechselkurskonzept der Domäne dar, sodass diese in der Domänenschicht leben. Obwohl es wie ein einfaches DTO erscheint, wird es in DDD als Wertobjekt bezeichnet und kann zusätzliche Geschäftslogik zum Vergleichen oder Transformieren von Instanzen enthalten.
Niels van der Rest
6
Ich bin mit dem Teil nicht einverstanden, in dem Sie mit Vijay nicht einverstanden sind, und hier ist der Grund dafür. CachingExchangeRateService ist ein Infrastrukturproblem. Obwohl Sie einen ICache generell akzeptieren, hängt die Implementierung für diesen ICache von der jeweiligen Technologie ab (z. B. Web, Windows). Nur weil es generisch ist, ist es kein Anwendungsdienst. Ein Anwendungsdienst ist die API Ihrer Domain. Was passiert, wenn Sie Ihre Domain einer anderen Person offenlegen möchten, die eine App schreibt? Application Services, und sie müssen möglicherweise nicht zwischengespeichert werden, sodass Ihr Caching-Gerät für sie nutzlos ist (dh warum es sich um eine Infrastruktur handelt)
Aaron Hawkins,
38

Die beste Ressource, die mir geholfen hat, den Unterschied zwischen einem Anwendungsdienst und einem Domänendienst zu verstehen, war die Java-Implementierung des hier gefundenen Frachtbeispiels von Eric Evans . Wenn Sie es nicht herunterladen, können Sie die Interna von RoutingService (einem Domänendienst) und BookingService, CargoInspectionService (Application Services) überprüfen.

Mein 'Aha'-Moment wurde durch zwei Dinge ausgelöst:

  • Lesen Sie die Beschreibung der Dienste im obigen Link, genauer diesen Satz:

    Domänendienste werden in Form der allgegenwärtigen Sprache und der Domänentypen ausgedrückt, dh die Methodenargumente und die Rückgabewerte sind geeignete Domänenklassen.

  • Lesen Sie diesen Blog-Beitrag , insbesondere diesen Teil:

    Was ich bei der Trennung der Äpfel von den Orangen sehr hilfreich finde, ist das Denken in Bezug auf den Anwendungsworkflow. Die gesamte Logik, die den Anwendungsworkflow betrifft, wird normalerweise in die Anwendungsschicht einbezogen, während Konzepte aus der Domäne, die nicht als Modellobjekte zu passen scheinen, einen oder mehrere Domänendienste bilden.

Ghola
quelle
3
Ich stimme zu, genau so definiere ich Application Services und es passt zu allen Situationen, die ich bisher getroffen habe. Domänendienste befassen sich mit allem, was mit Domänenobjekten zusammenhängt, aber über den Rahmen einer einzelnen Entität hinausgeht. Beispiel: BookReferencesService.GetNextAvailableUniqueTrackingNumber (), der Fokus liegt eindeutig auf Geschäftsregeln *. In Bezug auf den Anwendungsdienst ist es genau das, was Sie beschreiben. Meistens beginne ich damit, diesen Geschäftsworkflow in meine Controller-Aktionen zu integrieren, und wenn ich es bemerke, überarbeite ich diese Logik in der Anwendungsdienstschicht. Wir könnten sagen, dass diese Ebene für Anwendungsfälle ist
tobiak777
1
* Und solche Domain-Service-Schnittstellen werden von den Domain-Entitäten verwendet.
tobiak777
32

Der Domänendienst ist die Erweiterung der Domain. Es sollte nur im Kontext der Domain gesehen werden. Dies ist keine Benutzeraktion wie zum Beispiel ein Konto schließen oder so. Der Domänendienst passt dort, wo es keinen Status gibt. Andernfalls wäre es ein Domänenobjekt. Der Domänendienst leistet etwas, das nur dann sinnvoll ist, wenn er mit anderen Mitarbeitern (Domänenobjekten oder anderen Diensten) durchgeführt wird. Und das macht Sinn und liegt in der Verantwortung einer anderen Schicht.

Anwendungsdienst ist die Schicht, die die Interaktion zwischen den Domänenobjekten und -diensten initialisiert und überwacht. Der Ablauf sieht im Allgemeinen folgendermaßen aus: Domänenobjekt (oder Objekte) aus dem Repository abrufen, eine Aktion ausführen und dort ablegen (oder nicht). Es kann mehr - zum Beispiel kann es prüfen, ob ein Domänenobjekt vorhanden ist oder nicht, und Ausnahmen entsprechend auslösen. Auf diese Weise kann der Benutzer mit der Anwendung interagieren (und von dort stammt wahrscheinlich der Name), indem Domänenobjekte und -dienste bearbeitet werden. Anwendungsdienste sollten im Allgemeinen alle möglichen Anwendungsfälle darstellen. Das Beste, was Sie tun können, bevor Sie über die Domäne nachdenken, ist wahrscheinlich, Anwendungsdienstschnittstellen zu erstellen, die Ihnen einen viel besseren Einblick in das geben, was Sie wirklich versuchen. Mit diesem Wissen können Sie sich auf die Domäne konzentrieren.

Repositorys können im Allgemeinen in Domänendienste eingefügt werden, dies ist jedoch ein eher seltenes Szenario. Es ist jedoch die Anwendungsschicht, die dies die meiste Zeit tut.

kboom
quelle
10
"Der Domänendienst passt dort, wo es keinen Status gibt. Andernfalls wäre es ein Domänenobjekt." hat es für mich zum Klicken gebracht. Danke dir.
Nick
31

Aus dem Red Book (Implementing Domain Driven Design, von Vaughn Vernon) verstehe ich die Konzepte folgendermaßen:

Domänenobjekte ( Entitäten und Wertobjekte ) kapseln das von der (Unter-) Domäne geforderte Verhalten und machen es natürlich, ausdrucksstark und verständlich.

Domänendienste kapseln solche Verhaltensweisen, die nicht in ein einzelnes Domänenobjekt passen . Beispielsweise kann eine Buchbibliothek, die a Bookan a Client(mit entsprechenden InventoryÄnderungen) leiht , dies von einem Domänendienst aus tun.

Anwendungsdienste behandeln den Ablauf von Anwendungsfällen, einschließlich aller zusätzlichen Bedenken, die zusätzlich zu den Domänen erforderlich sind . Solche Methoden werden häufig über ihre API für den Verbrauch durch externe Clients verfügbar gemacht. Um auf unserem vorherigen Beispiel aufzubauen, stellt unser Anwendungsdienst möglicherweise eine Methode bereit LendBookToClient(Guid bookGuid, Guid clientGuid), die:

  • Ruft die ab Client.
  • Bestätigt seine Berechtigungen. ( Beachten Sie, wie wir unser Domain-Modell frei von Sicherheits- / Benutzerverwaltungsbedenken gehalten haben. Eine solche Verschmutzung kann zu vielen Problemen führen. Stattdessen erfüllen wir diese technische Anforderung hier in unserem Anwendungsservice. )
  • Ruft die ab Book.
  • Ruft den Domänendienst auf (Übergabe des Clientund Book), um die eigentliche Domänenlogik für das Ausleihen des Buches an den Client zu übernehmen. Ich stelle mir zum Beispiel vor, dass die Bestätigung der Verfügbarkeit des Buches definitiv Teil der Domänenlogik ist.

Ein Anwendungsdienst sollte im Allgemeinen einen sehr einfachen Ablauf haben. Komplexe Anwendungsdienstabläufe weisen häufig darauf hin, dass die Domänenlogik aus der Domäne ausgetreten ist.

Wie Sie hoffentlich sehen können, bleibt das Domain-Modell auf diese Weise sehr sauber und ist leicht zu verstehen und mit den Domain-Experten zu diskutieren, da es nur seine eigenen, tatsächlichen geschäftlichen Bedenken enthält. Der Anwendungsfluss , auf der anderen Seite, ist auch viel einfacher zu handhaben , da es von Domain betrifft entlastet wird, und wird präzise und unkompliziert.

Timo
quelle
2
Ich würde sagen, dass der Anwendungsdienst auch der Punkt ist, an dem Abhängigkeiten aufgelöst werden. Die Methode ist ein Anwendungsfall, ein einzelner Ablauf, sodass fundierte Entscheidungen über konkrete Implementierungen getroffen werden können. Auch hier passen Datenbanktransaktionen.
Timo
10

Domänendienste: Methoden, die nicht wirklich auf eine einzelne Entität passen oder Zugriff auf das Repository erfordern, sind in Domänendiensten enthalten. Die Domänendienstschicht kann auch eine eigene Domänenlogik enthalten und ist ebenso Teil des Domänenmodells wie Entitäten und Wertobjekte.

Anwendungsdienste: Der Anwendungsdienst ist eine dünne Schicht, die sich über dem Domänenmodell befindet und die Anwendungsaktivität koordiniert. Es enthält keine Geschäftslogik und enthält nicht den Status von Entitäten. Es kann jedoch den Status einer Business Workflow-Transaktion speichern. Sie verwenden einen Anwendungsdienst, um mithilfe des Request-Reply-Messaging-Musters eine API für das Domänenmodell bereitzustellen.

Millett, C (2010). Professionelle ASP.NET-Entwurfsmuster. Wiley Publishing. 92.

GorkemHalulu
quelle
6

Domänendienste : Ein Dienst, der eine Geschäftslogik ausdrückt , die nicht Teil eines aggregierten Stamms ist.

  • Sie haben 2 Aggregate:

    • Product welches Name und Preis enthält.
    • Purchase Hier finden Sie das Kaufdatum, eine Liste der bestellten Produkte mit Menge und Produktpreis zu diesem Zeitpunkt sowie die Zahlungsmethode.
  • Checkout ist nicht Teil eines dieser beiden Modelle und ist ein Konzept in Ihrem Unternehmen.

  • Checkoutkann als Domänendienst erstellt werden, der alle Produkte abruft und den Gesamtpreis berechnet, den Gesamtbetrag bezahlt, indem er einen anderen Domänendienst PaymentServicemit einem Implementierungsteil der Infrastruktur aufruft und in diesen konvertiert Purchase.

Anwendungsdienste : Ein Dienst, der Domänenmethoden "orchestriert" oder ausübt. Dies kann so einfach sein wie nur Ihr Controller.

Dies ist der Ort, an dem Sie normalerweise Folgendes tun:

public String createProduct(...some attributes) {
  if (productRepo.getByName(name) != null) {
    throw new Exception();
  }

  productId = productRepository.nextIdentity();

  product = new Product(productId, ...some attributes);

  productRepository.save(product);

  return productId.value();
  // or Product itself
  // or just void if you dont care about result
}

public void renameProduct(productId, newName) {
  product = productRepo.getById(productId);

  product.rename(newName);

  productRepo.save(product);
}

Sie können hier Validierungen durchführen, z. B. prüfen, ob a Producteindeutig ist. Sofern ein Producteindeutiges Wesen keine Invariante ist, sollte dies Teil des Domänendienstes sein, der möglicherweise aufgerufen wird, UniqueProductCheckerda es nicht Teil der ProductKlasse sein kann und mit mehreren Aggregaten interagiert.

Hier ist ein vollständiges Beispiel für ein DDD-Projekt: https://github.com/VaughnVernon/IDDD_Samples

Sie finden viele Beispiele für Anwendungsdienste und einige Domänendienste

ist egal
quelle
Ist es obligatorisch, Entitäten nur in Application Services zu validieren und zu speichern? Wenn ich Entitäten A, B und C habe und alle miteinander in Beziehung stehen (A -> B -> C) und die Operation auf A Änderungen an B und C verursachen sollte, indem ein Domänendienst von einem anderen aufgerufen wird, wie geht das?
MrNVK
> Ist es obligatorisch, Entitäten nur in Application Services zu validieren und zu speichern? Wenn Sie müssen, dann ja. In den meisten Fällen müssen Sie überprüfen, ob eine ID vorhanden ist, da Sie sonst an einer Nullvariablen arbeiten.
keine Rolle
1
> Wenn ich Entitäten A, B und C habe und alle miteinander in Beziehung stehen (A -> B -> C) und die Operation auf A Änderungen an B und C verursachen sollte, indem ein Domänendienst von einem anderen aufgerufen wird, wie es geht ? Ich bin mir nicht sicher, was Sie unter "Aufrufen eines Domänendienstes von einem anderen" verstehen, aber für Reaktionen auf Änderungen einer Entität können Sie Ereignisse verwenden oder sie einfach mit dem Anwendungsdienst orchestrieren, z. ). Suche nach: Orchestration vs Choreography
keine Rolle
Vielen Dank für die Antwort! "Aufrufen eines Domänendienstes von einem anderen" - Ich meine, wenn ich eine komplexe Operation für Entität A habe, muss ich ADomainService verwenden. Diese Operation wirkt sich jedoch zusätzlich zu Entität A auf Entität B aus. Die Operation, die für Entität B im ADomainService ausgeführt werden muss, ist ebenfalls komplex. Also muss ich BDomainService von ADomainService verwenden. Jetzt bezweifle ich diesen Ansatz :) Aber wenn ich diese Logik in den ApplicationService einfügen würde, würde dies nicht die Kapselung von Geschäftsprozessen unterbrechen, die sich nur in der Domänenschicht und nicht in der Anwendungsschicht befinden sollten?
MrNVK
Sie können ein Ereignis von Ihrem Domänendienst einfach ausgeben, wenn Sie der Meinung sind, dass es sich um einen Domänendienst anstelle eines Anwendungsdienstes handeln sollte.
keine Rolle
0

Stellen Sie sich einen Domänendienst als ein Objekt vor, das Geschäftslogik oder mit Geschäftsregeln verbundene Logik für Domänenobjekte implementiert. Diese Logik lässt sich nur schwer in dieselben Domänenobjekte einfügen und verursacht auch keine Statusänderung des Domänendienstes (Domänendienst ist ein Objekt ohne ein "Status" oder besser ohne einen Status, der eine geschäftliche Bedeutung hat), aber schließlich den Status nur der Domänenobjekte ändert, auf denen gearbeitet wird.

Während ein Anwendungsdienst Logik auf Anwendungsebene als Benutzerinteraktion, Eingabevalidierung implementiert, bezieht sich die Logik nicht auf das Geschäft, sondern auf andere Belange: Authentifizierung, Sicherheit, E-Mail usw., und beschränkt sich darauf, einfach Dienste zu verwenden, die von Domänenobjekten verfügbar gemacht werden.

Ein Beispiel hierfür könnte das folgende Szenario sein, das nur zur Erläuterung gedacht ist: Wir müssen eine sehr kleine Domotic Utility-App implementieren, die eine einfache Operation ausführt, dh "das Licht einschalten, wenn jemand die Tür eines Hauszimmers öffnet, um einzutreten." in und schalten Sie das Licht aus, wenn Sie die Tür schließen, die aus dem Raum austritt ".

Vereinfachen viel wir nur 2 Domain Einheiten betrachten: Doorund Lampjeder von ihnen hat zwei Zustände, respectevely open/closedund on/offund spezifischen Methoden Zustandsänderungen an ihnen zu arbeiten.

In diesem Fall benötigen wir einen Domänendienst, der die spezifische Operation zum Einschalten des Lichts ausführt, wenn jemand die Tür von außen öffnet, um in einen Raum zu gelangen, da die Tür und die Lampenobjekte diese Logik nicht auf eine Weise implementieren können, die wir für geeignet halten zu ihrer Natur .

Wir können unsere Domain Service wie aufrufen DomoticDomainServiceund 2 Methoden implementieren: OpenTheDoorAndTurnOnTheLightund CloseTheDoorAndTurnOffTheLightdiese zwei Methoden ändern respectevely den Zustand der beiden Objekte Doorund Lampzu open/onund closed/off.

Der Status des Ein- oder Ausstiegs aus einem Raum ist im Domänendienstobjekt und auch nicht in den Domänenobjekten vorhanden, wird jedoch als einfache Benutzerinteraktion von einem Anwendungsdienst HouseServiceimplementiert , den wir möglicherweise aufrufen und der einige Ereignishandler als implementiert onOpenRoom1DoorToEnterund onCloseRoom1DoorToExitusw. für jeden Raum (dies ist nur ein Beispiel zur Erläuterung des Zwecks) , die sich jeweils auf Anrufdomänendienstdienste zur Ausführung des besuchten Verhaltens beziehen (wir haben die Entität nicht berücksichtigt, Roomda es sich nur um ein Beispiel handelt). .

Dieses Beispiel, das weit davon entfernt ist, eine gut gestaltete Anwendung in der realen Welt zu sein, hat (wie bereits mehrfach erwähnt) den einzigen Zweck, zu erklären, was ein Domänendienst und sein Unterschied zu einem Anwendungsdienst sind. Ich hoffe, er ist klar und nützlich.

Ciro Corvino
quelle
Ciro: Ihr Beispiel ist nicht praktisch und sehr verwirrend.
Morteza Azizi
Hallo Morteza, könntest du genauer sein? Ihr Risiko besteht darin, nur ein "Urteil" ohne wirkliches Argument zu sein. Vielen Dank
Ciro Corvino