我应该如何在域驱动设计结构中表示文件导入器?
How should i represent a file importer in Domain Driven Design structure?
我有这样的洋葱架构:
http://i.stack.imgur.com/qvyS5.png
我需要创建一个导入程序来监控文件夹并将文件导入数据库。
该进口商将 运行 提交 Windows 表格申请。
组件导入器 (class) 是我的基础设施或域的一部分?
否则应该如何按照 DDD 原则表示?
应用程序服务(如果我不理解您的应用程序意图,可能是域服务)。您的软件的目的是 监控文件 ,因此您的域中可能有 "file" class,IFileWatcher 作为文件夹观察器的抽象,IFileRepository 用于存储。 ..
"importer" 将使用这些接口。 this 是洋葱架构的更好形象。
还有2件事;
洋葱架构的底线是一种方式(一种架构方式)让您的域免受非域问题的影响(例如应用程序在linux中运行或 windows,将数据保存在 oracle,sql 服务器或文件系统中,UI 不会更改您的域模型等...)。
我是 DDD 的超级粉丝,但我觉得你的问题不值得(也许以数据为中心的架构会更好)。正如@Didaxis 所说:保持简单。尽可能简单地开发你的软件,应用 SOLID 原则,然后你会没事的。当你的应用程序增长时,你总是可以重新组织项目结构(顺便说一下,洋葱架构有大量的 DI 使用)。所以我建议您保持应用程序简单并应用 SOLID。
编辑:
这里有一些关于何时使用 DDD 以及何时不使用 DDD 的文章:
任何集成都应该在应用层而不是域中实现。因此,根据洋葱架构(或其他任何架构),这将是基础设施。
我倾向于将域视为物理计算器。计算器有输入(键盘)和输出(屏幕)。因此,域永远不会与域外的资源进行物理交互。域需要的一切都将从应用层传递给它,结果将由应用层处理。
因此,即使实际的数据库访问(例如使用面向持久性的存储库)和文件访问可能在基础架构中,应用程序层也会执行调用以获取对象,或者在它们被执行之前将它们放在一起基于域。
当我使用术语层时,它更像是一个逻辑问题,而不是物理层。物理结构将取决于几个因素,包括大量的偏好:)
因此,在您的情况下,您的 Windows 表单很可能充当应用程序层。它当然是整合点。但是,理想情况下,物理实现应该依赖于一些可重用的程序集,这些程序集可以从 Windows 服务甚至网站中使用。
我有这样的洋葱架构:
http://i.stack.imgur.com/qvyS5.png
我需要创建一个导入程序来监控文件夹并将文件导入数据库。
该进口商将 运行 提交 Windows 表格申请。
组件导入器 (class) 是我的基础设施或域的一部分?
否则应该如何按照 DDD 原则表示?
应用程序服务(如果我不理解您的应用程序意图,可能是域服务)。您的软件的目的是 监控文件 ,因此您的域中可能有 "file" class,IFileWatcher 作为文件夹观察器的抽象,IFileRepository 用于存储。 ..
"importer" 将使用这些接口。 this 是洋葱架构的更好形象。
还有2件事;
洋葱架构的底线是一种方式(一种架构方式)让您的域免受非域问题的影响(例如应用程序在linux中运行或 windows,将数据保存在 oracle,sql 服务器或文件系统中,UI 不会更改您的域模型等...)。
我是 DDD 的超级粉丝,但我觉得你的问题不值得(也许以数据为中心的架构会更好)。正如@Didaxis 所说:保持简单。尽可能简单地开发你的软件,应用 SOLID 原则,然后你会没事的。当你的应用程序增长时,你总是可以重新组织项目结构(顺便说一下,洋葱架构有大量的 DI 使用)。所以我建议您保持应用程序简单并应用 SOLID。
编辑: 这里有一些关于何时使用 DDD 以及何时不使用 DDD 的文章:
任何集成都应该在应用层而不是域中实现。因此,根据洋葱架构(或其他任何架构),这将是基础设施。
我倾向于将域视为物理计算器。计算器有输入(键盘)和输出(屏幕)。因此,域永远不会与域外的资源进行物理交互。域需要的一切都将从应用层传递给它,结果将由应用层处理。
因此,即使实际的数据库访问(例如使用面向持久性的存储库)和文件访问可能在基础架构中,应用程序层也会执行调用以获取对象,或者在它们被执行之前将它们放在一起基于域。
当我使用术语层时,它更像是一个逻辑问题,而不是物理层。物理结构将取决于几个因素,包括大量的偏好:)
因此,在您的情况下,您的 Windows 表单很可能充当应用程序层。它当然是整合点。但是,理想情况下,物理实现应该依赖于一些可重用的程序集,这些程序集可以从 Windows 服务甚至网站中使用。