• ASP.NET MVC 开源项目学习之ProDinner (三)


    第四层: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

  • 相关阅读:
    MySQL中的MRR和BKA
    MySQL中的BNL优化器
    MySQL中索引
    MySQL中的两种排序方式: index和filesort
    设计模式之观察者模式
    设计模式之策略模式
    设计模式之模板方法
    java和JavaScript的区别
    HTML 简介--from app (W3)
    与代码同行-五年计划
  • 原文地址:https://www.cnblogs.com/miaoying/p/4995537.html
Copyright © 2020-2023  润新知