第四层: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, , , true);
var small = Imager.Resize(img, , , true);
var mini = Imager.Resize(img, , , 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, , , 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

ASP.NET MVC 开源项目学习之ProDinner (三)的更多相关文章

  1. ASP.NET MVC 开源项目学习之ProDinner (一)

    首先在github上面将ProDinner项目通过 Git Bash 克隆到本地,接下来我们开始分析这个项目吧~ 系统采用.Net 4.5, Asp.net Mvc 5,VS2012,Sql serv ...

  2. ASP.NET MVC 开源项目学习之ProDinner (二)

    下面我们来看第二层:Data   这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. pr ...

  3. ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

    一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...

  4. ASP.Net MVC开发基础学习笔记:一、走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  5. ASP.Net MVC开发基础学习笔记(1):走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. angular2+typescript在asp.net MVC Web项目上的实现

    网上现在还没有关于angular2+typescript在asp.net mvc web项目上的实现的系统介绍,这里我也只是探索到了一个简单的方式,还有很多问题没能解决.但是能有个好的开头也值得记录一 ...

  8. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  9. ASP.NET MVC搭建项目后台UI框架—1、后台主框架

    目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...

随机推荐

  1. Ubuntu防火墙 UFW 设置

    Ubuntu防火墙 UFW 设置 1.安装 sudo apt-get install ufw 2.启用 sudo ufw enable sudo ufw default deny 运行以上两条命令后, ...

  2. 黄聪:Discuz!X3.2 如何配置超级版主或者某些管理员,允许管理用户组或者权限

    点击后台-->站长-->后台管理团队-->新增用户(用户名)用户管理员即可

  3. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

  4. 3.函数Function

    所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,便于日后重用是调用. function sum(a,b){ var c = a+b; return c; } 1.一个函 ...

  5. 转--简单工厂模式 Simple Factory

    简单工厂模式的作用就是定义一个用于创建对象的接口 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化.         先来看看它的组成: 1) 工厂类角色 ...

  6. M2M

    1, M2M (数据算法模型) M2M是将数据从一台终端传送到另一台终端,也就是机器与机器(Machine to Machine)的对话.   M2M简介 但从广义上M2M可代表机器对机器(Machi ...

  7. phpStudy(lnmp)集成环境安装

    phpStudy phpStudy » PHP教程 » phpStudy for Linux (lnmp+lamp一键安装包) phpStudy for Linux (lnmp+lamp一键安装包) ...

  8. SQL查詢數據字典

    SELECT d.name AS 表名 , f.value AS 表说明, 字段序号 = a.colorder , 字段名 = a.name , 标识 THEN '√' ELSE '' END , 主 ...

  9. 在UEFI下安装windows和Ubuntu双系统目前不可行

    UEFI是BIOS的升级,未来将取代BIOS,说白了,就是跟BISO差不多的作用.但是目前比较新的主板兼容两种设置就比较坑了,默认是UEFI,UEFI下只能安装win8以上的版本,和linux64位系 ...

  10. C++学习40 抛出自己的异常

    throw 是C++中的关键字,用来抛出异常.如果不使用 throw 关键字,try 就什么也捕获不到:上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常. throw 既可以用在 ...