C# 平面文件工作单元(DDD)的相关性?

C# 平面文件工作单元(DDD)的相关性?,c#,domain-driven-design,unit-of-work,C#,Domain Driven Design,Unit Of Work,因此,我正在开发一个DDD应用程序,我将跳过细节,但从全局来看:其中一个服务的目标是从数据库检索信息,对其进行处理,并将“处理后的数据”(实际上是一个聚合)写入一个平面文件(不,我不能更改它-平面文件将被发送到可以解释该文件的打印机)。除了平面文件部分,没有什么与众不同的。在编写代码时,我想,当然,我需要将处理数据的结果作为应用程序服务的一部分写入文件,对我来说,这与通过存储库类使用工作单元将聚合写入数据库是一样的 所以我的问题是:作为DDD的一部分,FlatFileUnitOfWork合法吗?

因此,我正在开发一个DDD应用程序,我将跳过细节,但从全局来看:其中一个服务的目标是从数据库检索信息,对其进行处理,并将“处理后的数据”(实际上是一个聚合)写入一个平面文件(不,我不能更改它-平面文件将被发送到可以解释该文件的打印机)。除了平面文件部分,没有什么与众不同的。在编写代码时,我想,当然,我需要将处理数据的结果作为应用程序服务的一部分写入文件,对我来说,这与通过存储库类使用工作单元将聚合写入数据库是一样的

所以我的问题是:作为DDD的一部分,FlatFileUnitOfWork合法吗?如果是的话,有没有人有这样的例子?因为对我来说,这是相当罕见的,而且我无法找到“FlatFileUnitOfWork”的正确示例

非常感谢

注意:Web API是用C#

编写的,我认为这要视情况而定!)

根据您的描述,工作单元在您的情况下不太可能是合适的模式。顾名思义,什么是合适的解决方案取决于域名(编辑:缩短)

我的问题是:印刷背后的业务流程是什么。这仅仅是一件小事,还是核心领域的一个关键部分(例如,整个应用程序是关于革命性地打印出酷设计的音乐会门票),还是介于两者之间

如果这只是一个小问题——远远地说,与核心域无关——那么应用程序事件或命令就可以了。例如,您在核心域的上下文中发出一个应用程序事件,然后在另一个上下文中捕获该事件,该上下文通过向打印机发送平面文件让打印机完成其工作。或者,此打印可能属于相同的上下文(仍然是一个小问题)。在这种情况下,应用程序服务可能会调用(或“命令”)基础结构层的porper模块,通过平面文件进行打印

如果它是核心域的一部分,那么它可能会发生,例如,域服务以某种方式负责编写关键的打印内容,或者类似的事情。在这种情况下,解决方案的精确细节将取决于对核心领域的彻底分析(知识处理、领域建模)

编辑-示例案例

在我的示例中,我假设您有一个票务打印微型服务,这是您的核心领域,因为您正在打印有史以来最酷的音乐会票务,这是整个应用程序的要点

在这项服务中,我设想您有一个复杂的域模型来构建最酷的票证布局,其上有一个
TicketComposer
提供一个
ticketoprint
值对象,其中包含打印所需的所有重要信息-例如:

public TicketToPrint ComposeTicketToPrint(SoldTicket ticket)
{
    // ...
}
public void PrintSoldTicket(SoldTicketDTO ticketDto)
{
    SoldTicket soldTicket = CreateSoldTicket(ticketDto);

    var composer = new TicketComposer();
    TicketToPrint ticketToPrint = composer.ComposeTicketToPrint(soldTicket);

    var printer = new TicketPrinter();
    printer.Print(ticketToPrint);
}
在这种情况下,您需要在基础架构层中有一个
ticketprint
类,该类负责打印该票据。您的应用程序层都不应该知道它是如何做到这一点的。即,您的应用程序服务方法如下所示:

public TicketToPrint ComposeTicketToPrint(SoldTicket ticket)
{
    // ...
}
public void PrintSoldTicket(SoldTicketDTO ticketDto)
{
    SoldTicket soldTicket = CreateSoldTicket(ticketDto);

    var composer = new TicketComposer();
    TicketToPrint ticketToPrint = composer.ComposeTicketToPrint(soldTicket);

    var printer = new TicketPrinter();
    printer.Print(ticketToPrint);
}
然后在链的最后,您的
ticketprint
基础设施层中执行您要求的任务:

public void Print(TicketToPrint ticketToPrint)
{
    // Creating the flat file and sending it to the printer...
}
此示例是否回答了您的问题?

加入,我认为这取决于!)

根据您的描述,工作单元在您的情况下不太可能是合适的模式。顾名思义,什么是合适的解决方案取决于域名(编辑:缩短)

我的问题是:印刷背后的业务流程是什么。这仅仅是一件小事,还是核心领域的一个关键部分(例如,整个应用程序是关于革命性地打印出酷设计的音乐会门票),还是介于两者之间

如果这只是一个小问题——远远地说,与核心域无关——那么应用程序事件或命令就可以了。例如,您在核心域的上下文中发出一个应用程序事件,然后在另一个上下文中捕获该事件,该上下文通过向打印机发送平面文件让打印机完成其工作。或者,此打印可能属于相同的上下文(仍然是一个小问题)。在这种情况下,应用程序服务可能会调用(或“命令”)基础结构层的porper模块,通过平面文件进行打印

如果它是核心域的一部分,那么它可能会发生,例如,域服务以某种方式负责编写关键的打印内容,或者类似的事情。在这种情况下,解决方案的精确细节将取决于对核心领域的彻底分析(知识处理、领域建模)

编辑-示例案例

在我的示例中,我假设您有一个票务打印微型服务,这是您的核心领域,因为您正在打印有史以来最酷的音乐会票务,这是整个应用程序的要点

在这项服务中,我设想您有一个复杂的域模型来构建最酷的票证布局,其上有一个
TicketComposer
提供一个
ticketoprint
值对象,其中包含打印所需的所有重要信息-例如:

public TicketToPrint ComposeTicketToPrint(SoldTicket ticket)
{
    // ...
}
public void PrintSoldTicket(SoldTicketDTO ticketDto)
{
    SoldTicket soldTicket = CreateSoldTicket(ticketDto);

    var composer = new TicketComposer();
    TicketToPrint ticketToPrint = composer.ComposeTicketToPrint(soldTicket);

    var printer = new TicketPrinter();
    printer.Print(ticketToPrint);
}
在这种情况下,您需要在基础架构层中有一个
ticketprint
类,该类负责打印该票据。您的应用程序层都不应该知道它是如何做到这一点的。即,您的应用程序服务方法如下所示:

public TicketToPrint ComposeTicketToPrint(SoldTicket ticket)
{
    // ...
}
public void PrintSoldTicket(SoldTicketDTO ticketDto)
{
    SoldTicket soldTicket = CreateSoldTicket(ticketDto);

    var composer = new TicketComposer();
    TicketToPrint ticketToPrint = composer.ComposeTicketToPrint(soldTicket);

    var printer = new TicketPrinter();
    printer.Print(ticketToPrint);
}
然后在链的最后,您的
ticketprint
基础设施层中执行您要求的任务:

public void Print(TicketToPrint ticketToPrint)
{
    // Creating the flat file and sending it to the printer...
}
这个样本回答y吗