第四层:Resources 这一层里面主要是几个资源文件.
资源文件知识小杂烩:
几乎每一个生产性应用程序都需要使用资源。资源是在逻辑上由应用程序部署的任何非可执行数据。资源可以在应用程序中作为错误信息显示,或者作为用户 界面的一部分显示。资源可以包含多种形式的数据,包括字符串、图像和持久的对象。通过在资源文件中存储数据,无需重新编译整个应用程序即可更改数据。在.net中,有文本文件.resx 文件和 .resources 文件三种资源文件。如果资源将只包含字符串数据,则文本文件是最简单的选择。如果资源将包含对象或字符串与对象的组合,则必须创建 .resx 文件或 .resources 文件。注意,只有 .resources 文件才应能嵌入在公共语言运行库程序集和附属程序集中。ProDinner里用到的就是.resx文件.
.resx 资源文件格式由 XML 项组成,这些 XML 项指定 XML 标记内的对象和字符串。 .resx 文件的一个优点在于,当用文本编辑器(例如记事本或 Microsoft Word)打开此类文件时,可以对其进行写入、分析和操纵。 查看 .resx 文件时,如果嵌入对象(如图片)的二进制格式是资源清单的一部分,则可以实际看见此二进制信息。 除了此类二进制信息之外,.resx 文件是完全可读和可维护的。 不要使用资源文件来存储密码、安全敏感信息或保密数据。
使用详情可以参看这篇文章 http://www.cnblogs.com/JamesLi2015/archive/2011/12/20/2294156.html
ProDinner里面用到.resx文件主要是便于实现多国语言.但是在.resx的命名上,需要按照这样的规则:
Resource.zh-cn.resx(对应简体中文资源文件)
Resource.en-us.resx(对应美国英语资源文件)
中间的Culture名字很重要。
通常在开发时,只要一个默认的Resource.resx,当开发完成之后,拷贝一个相同的Resource.resx,并改名字成上面的样子,然后手动或自动将其中的所有value都翻译成对应的语言。
第五层:Service
该层在功用上看其名称我们应该大致就能知道它是做什么的,Service---提供服务的,类似我们三层架构中的服务提供层或业务逻辑层.
由于整个项目用到了,Castle的依赖倒转,所以这层在实现业务逻辑时,运用的手法也是比较抽象的,在和具体的业务相关联的时候,并没有使用具体的类型,而是使用泛型T,Expression<Func<T, bool>>来解决耦合问题.
功能类划分
CrudService.cs--实体业务逻辑实现service
FileManagerService.cs---文件上传、图片上传service
MealService.cs---图片设置具体到项目中,为设置每个食物的图片而单独的一个service
UserService.cs---用户信息操作业务实现层
首先,CrudService类,看看类名:
public class CrudService<T> : ICrudService<T> where T : DelEntity, new()
做了泛型类,不仅类本身做了类型限制,连同其继承的接口类型都做了类型限制。Public class CrudService<T>,使用泛型类的一个好处就是,类中定义的所有操作并不针对一个特定的Model实体,而是根据在调用实例化的时 候传过来的类型而定,换句话说,该类中定义的所有方法适用T类型,所以普通的增删改查都定义在了这个类当中。这和我们很多同学在写业务逻辑的时候,针对一 个Model去写一个业务实现,就如同一个屌丝和一个高富帅的距离。
ICrudService<T> where T,这句话翻译成普通话就是,要求类型T实现ICrudService,CrudService进行了显式约束继承,换句话说,T具备这些接口定义的所有方法。
DelEntity继承实现了Entity一个具体的Model,这个Model只有一ID,说到底也是最公用的东西。
New()该类必须实例化使用,官方正规说辞,必须具备Public构造函数。
再次:FileManagerService类
public class FileManagerService : IFileManagerService
里面仅三个类:
public void DeleteImages(string root, string filename) { var dirPath = root + MealsPath; File.Delete(dirPath + filename); File.Delete(dirPath + "s" + filename); File.Delete(dirPath + "m" + filename); }
//这个方法实体,很常用,方法体实现了删除大中小三张图片,做电商应该会经常遇到这样的问题,一张图片上传后,会生产不同规格尺寸的图片, public void MakeImages(string root, string filename, int x, int y, int w, int h) { using (var image = Image.FromFile(root + TempPath + filename)) { var dirPath = root + MealsPath; var img = Imager.Crop(image, new Rectangle(x, y, w, h)); var resized = Imager.Resize(img, 200, 150, true); var small = Imager.Resize(img, 100, 75, true); var mini = Imager.Resize(img, 45, 34, true); Imager.SaveJpeg(dirPath + filename, resized); Imager.SaveJpeg(dirPath + "s" + filename, small); Imager.SaveJpeg(dirPath + "m" + filename, mini); } } public string SaveTempJpeg(string root, Stream inputStream, out int w, out int h) { var fileName = Guid.NewGuid() + ".jpg"; var filePath = root + TempPath + fileName; using (var image = Image.FromStream(inputStream)) { var resized = Imager.Resize(image, 533, 400, true); Imager.SaveJpeg(filePath, resized); w = resized.Width; h = resized.Height; return fileName; } }
这层代码开始和具体业务逻辑相关联了,并开始涉及到了Omu的使用,包括后面的View层都用使用到了Omu的自定义控件,尤其是其实现的MVC Ajax控件,有兴趣可以试用下,集成了Jquery的无刷新无js代码,正式版应该是需要收费的:http://awesome.codeplex.com/discussions/428678