我的项目中有以下架构:
UI - >申请 - >域名 - >基础设施(4层)
我需要允许用户上传图片,哪里有更好的位置来保存用户生成的文件?在UI项目的文件夹中?
更新
这是我的文件夹结构:
感谢您的回答,但我也想知道在哪里保存物理文件。
更新2:
我的应用是CMS,这些图片是用户生成的内容。
答案 0 :(得分:3)
让基础设施处理这些细节。如果需要任何类型的验证或业务规则,那么就像常规数据一样处理它,因为就是这样。唯一的区别是您可能将这些数据保存在不同的位置,但这是一个实现细节。
稍后,您可能希望将这些文件存储在数据库中,或者存储在版本控制中...仍然可以抽象到基础架构层中的实现细节。
更新:确定,将文件保存在驱动器上的位置。 如果是我,不会将它们与我的代码混合在一起,因为这似乎很快就会变得复杂。 假设您想开始在版本控制中存储这些文件,现在您将一个版本控制系统中的代码与另一个版本控制系统中的数据混合在一起。我可能会选择一个至少与你的代码分开的地方:
两个想法:
Venus.Application
Venus.Domain
Venus.Infra
Venus.Tests
Venus.UI.Web
Venus.Files (or Data)
或者
Venus.Application
Venus.Domain
Venus.Infra
\Files (or Data)
Venus.Tests
Venus.UI.Web
我确实做过上传用户xml文件的事情,而我做了将文件保存在像第二个文件夹这样的文件夹中,并且好了一段时间,但后来我决定那些文件最好以文本的形式存储在数据库中,然后只在需要导出时才写出来。
答案 1 :(得分:1)
我认为这取决于正在上传的图像文件的特征。它们的用途是什么,它们需要存储多长时间。对于不需要长时间存在的短期图像,TEMP是他们的绝佳位置。
如果它们是长期/永久性文件,那么您需要考虑它们如何适合您的域模型。如果您的域以处理用户图像为中心,那么他们可能应该在您的域文件夹中占有一席之地(请记住,您不能忘记将用户上传的文件复制到不能从公共位置访问的位置的安全方面。网络服务器,但我假设你正在处理这个问题。)
但是,如果这些图像对域名不是那么重要,并且可能它们被用于美化/自定义用户的Web体验,那么它们可能属于UI文件夹中的某个位置。
DDD是关于设计一个尽可能地模拟问题域的解决方案;你应该最了解自己的领域,并运用最好的判断力。
答案 2 :(得分:0)
就物理存储它们的位置而言,我个人将它们存储在数据库中,方法是将它们存储为数据库提供的二进制数据类型之一。
您可以在对象/ DTO上设置一个Image属性,在保存时将其转换为字节。
根据我的经验,将所有用户数据保存在数据库中而不是使用物理文件的麻烦要少得多,因为您不必担心唯一的文件名,权限和移动服务器/部署等更容易,因为它们都包含在您可以轻松备份和移动的数据库。