C# 域模型中的映像应使用什么数据类型?

C# 域模型中的映像应使用什么数据类型?,c#,domain-driven-design,C#,Domain Driven Design,我正在使用Silverlight和DDD方法。我有一个Person域对象,它具有诸如FirstName、LastName、Address等属性。这个人需要一个图像 处理这个问题的最佳方法是什么 我真的不想在Person对象上放置Windows.Controls.Image属性,因为它将耦合到Silverlight/WPF,并且我可能希望在将来将此对象与其他技术(ASP、WinForms、下一个新事物等)结合使用 我还需要能够保存和加载图像的地方。将图像保存到数据库或文件系统是最佳做法?我目前正在

我正在使用Silverlight和DDD方法。我有一个Person域对象,它具有诸如FirstName、LastName、Address等属性。这个人需要一个图像

处理这个问题的最佳方法是什么

我真的不想在Person对象上放置Windows.Controls.Image属性,因为它将耦合到Silverlight/WPF,并且我可能希望在将来将此对象与其他技术(ASP、WinForms、下一个新事物等)结合使用

我还需要能够保存和加载图像的地方。将图像保存到数据库或文件系统是最佳做法?我目前正在使用nHibernate与Microsoft SQL Server,但我也希望能够支持nHibernate与mySql和其他一些数据库。也可能有一天我想用实体框架或其他技术来取代nHibernate(我正在使用存储库将其抽象出来)

有了这些信息,我应该如何为我的人处理图像?

嗯,
byte[]
(或者用
byte[]
包装的东西)是相当便携的。。。其他大部分内容都是特定于实现的

重新设置数据库与文件。。。出于客户端应用程序(Silverlight、WPF等)的目的,我可能会通过网页而不是WCF(etc)调用公开它们,即通过http调用返回图像的某个ASP.NET处理程序(或ASP.NET MVC路由)。然后,您在客户机中实际需要的就是图像的路径(
/people/images/12345
或其他任何内容)

用于存储-通常两者都可以。。。在SQLServer2008中,您可以使用文件流类型同时执行这两项操作。在数据库中存储blob的一个问题是增加大小,但是一些(小的)图像通常不会造成伤害(除非您使用的是sqlexpress并且具有限制的db大小)。但使用数据库有一个优势,即单个备份包含所有内容


尽管如此,我所做的每一个实现都使用了文件。

最佳实践是封装困难的决策。定义自己的图像类并隐藏实现


假设您没有编写图像编辑应用程序,则图像类的域部分将变薄。表示和存储不在域映像类中,它们在适配器中。

Hm,还有与技术无关的
System.Drawing.image。它完全代表了您想要的东西(imo):可以以某种众所周知的图像格式从某个流加载/保存到某个流,并且可以在屏幕上显示(以WinForms或WPF格式)。

您真的在使用二进制blob做任何事情吗?如果不是,则传递对文件系统上某些内容的引用。如果你开始随身携带
byte[]
之类的东西,我会担心会惹恼你

如果您是WPF,则所有内容都将URI作为图像源:

BitmapImage pic = new BitmapImage(new Uri("YourAssembly;components/images/something.jpg"));
请记住,如果您按照我建议的路线将其移动到Silverlight,您将需要一个
crossdomain.xml
文件来存放这些内容

如果您确实需要处理二进制blob,那么将所有这些作为某种形式的
,并让您的
Person.Image
类提供一种获取
StreamReader
/
StreamWriter
的方法,如
GetImageStream()
。然后,您的数据库资料可以获得一个
StreamReader
,然后将这些资料写入数据库。如果不进行检查,我猜几乎所有数据库都使用
流写入二进制blob,而不是
字节[]


…只是一些想法。别忘了BitmapImage也可以让你点击它的流,但你必须在文档中查找:-)希望这有帮助。

我选择文件系统有几个原因:

  • 您不必将图像类型存储在单独的字段中(BMP?JPEG?PNG?)
  • 您可以选择使用一个轻量级的、经过微调的服务器来服务您的图像(或者,如果您的缩放需要,可以选择多个服务器)
  • 您不需要在代码中弄乱字节[],只需使用字符串即可
  • 如果您决定更改数据库,问题就会少一些——您甚至可以通过为迁移插入脚本来解决问题

  • @marc,这里的输入错误我想“SDL2008”应该是“SQL2008”,但我很确定System.Drawing.Image——作为GDI+——是可以识别的。我不想在域对象中实现IDisposable。System.Drawing.Image从DDD的角度来看是一个很大的禁忌。你刚刚扼杀了任何技术转换的可能性