我的域模型中的Image应该使用哪种数据类型?

时间:2009-03-28 19:38:40

标签: c# domain-driven-design

我正在使用带有DDD方法的Silverlight。我有一个Person域对象,它具有FirstName,LastName,Address等属性.Persice需要有一个Image。

处理此问题的最佳方法是什么?

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

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

根据这些信息,我该如何为我的人处理图像?

5 个答案:

答案 0 :(得分:5)

好吧,byte[](或包含byte[]的东西)相当便携......其他大部分都是特定于实现的。

Re database vs file ...出于客户端应用程序的目的(Silverlight,WPF等),我可能会通过网页而不是WCF(等)调用来公开它们 - 即一些ASP.NET处理程序(或者ASP.NET MVC路由)通过http调用返回图像。然后,客户端中实际所需要的只是图像的路径(/people/images/12345或其他)。

对于存储 - 要么通常都很好......在SQL Server 2008中,您可以使用文件流类型同时执行这两项操作。将BLOB存储在数据库中的一个问题是增加了大小,但是一些(小)图像通常不会受到影响(除非您使用SQL Express并且具有上限数据库大小)。但是使用数据库的优势在于单个备份包含所有内容。

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

答案 1 :(得分:2)

你实际上是在使用二进制blob吗?如果没有,请传递对文件系统上某些内容的引用。如果你开始随身携带byte[]或者什么东西,我会担心会把事情搞砸。

如果您是WPF,那么所有内容都将URI作为ImageSource:

BitmapImage pic = new BitmapImage(new Uri("YourAssembly;components/images/something.jpg"));

请注意,如果您按照建议的路线移动并将其移至Silverlight,则您需要在域名中使用crossdomain.xml文件。

如果您确实需要弄乱二进制blob,请将所有内容保留为某个表单的Stream,并让Person.Image类提供获取StreamReader / {的方法{1}}就像StreamWriter一样。然后你的数据库东西可以获得GetImageStream()并将这些内容写入数据库。如果不进行检查,我的猜测就是每个数据库中都有二进制blob使用StreamReader而不是Stream写出来。

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

答案 2 :(得分:1)

最佳做法是封装困难的决策。定义自己的Image类并隐藏实现。

假设您没有编写图像编辑应用程序,Image类的域部分将变得很薄。演示文稿和存储不在您的域图像类中,它们位于适配器中。

答案 3 :(得分:1)

我会使用文件系统,原因有以下几种:

  1. 您不必将图像类型存储在单独的字段中(BMP?JPEG?PNG?)
  2. 您可以选择使用轻量级,经过精心调整的服务器来为您的图像提供服务(或者,如果您的扩展需求需要,可以选择几种)
  3. 你不需要在代码中乱用byte [] - 只需使用字符串
  4. 如果您决定更改数据库,问题会更少 - 您甚至可以使用INSERT脚本来完成迁移

答案 4 :(得分:0)

嗯,有System.Drawing.Image几乎与技术无关。它完全代表你想要的东西(imo):可以用某种着名的图像格式加载/保存到某些流中的东西,可以在屏幕上显示(在WinForms或WPF中)。