我正在使用带有DDD方法的Silverlight。我有一个Person域对象,它具有FirstName,LastName,Address等属性.Persice需要有一个Image。
处理此问题的最佳方法是什么?
我真的不想在Person对象上放置一个Windows.Controls.Image属性,因为它将耦合到Silverlight / WPF,我可能希望将来使用此对象与其他技术(ASP, WinForms,下一个新事物等)。
我还需要能够在某处保存并加载图像。将图像保存到数据库或文件系统是最佳做法吗?我目前正在使用nHibernate与Microsoft SQL Server,但我也希望能够支持nHibernate与mySql以及可能的其他一些数据库。我有可能有一天想用实体框架或其他技术替换nHibernate(我使用存储库将其抽象出来)。
根据这些信息,我该如何为我的人处理图像?
答案 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)
我会使用文件系统,原因有以下几种:
答案 4 :(得分:0)
嗯,有System.Drawing.Image
几乎与技术无关。它完全代表你想要的东西(imo):可以用某种着名的图像格式加载/保存到某些流中的东西,可以在屏幕上显示(在WinForms或WPF中)。