Asp.net MVC示例项目“Suteki.Shop”分析之Controller

在上文中,介绍了如何安装和使用Suteki,今天我们通过源码来看一下Suteki是如何使用Controller 。

在Suteki中,其使用Abstract的方式来定义一个ControllerBase,以此作为所有Controller的 基类,下面是其Controller的类设计图:


在该基类中定义了一些Controller中常用到的方法,比如为当前视图添加MetaDescription,Title等 :

[Rescue("Default"), Authenticate, CopyMessageFromTempDataToViewData]
public abstract class ControllerBase : Controller, IProvidesBaseService
{
private IBaseControllerService baseControllerService;

/// <summary>
/// Supplies services and configuration to all controllers
/// </summary>
public IBaseControllerService BaseControllerService
{
get { return baseControllerService; }
set
{
baseControllerService = value;

ViewData["Title"] = "{0}{1} ".With(
baseControllerService.ShopName,
GetControllerName());

ViewData["MetaDescription"] = "\"{0}\"".With (baseControllerService.MetaDescription);
}
}

public ILogger Logger { get; set; }

public virtual string GetControllerName()
{
return " - {0}".With(GetType().Name.Replace("Controller", ""));
}

public virtual void AppendTitle(string text)
{
ViewData ["Title"] = "{0} - {1}".With(ViewData["Title"], text);
}

public virtual void AppendMetaDescription(string text)
{
ViewData ["MetaDescription"] = text;
}

public string Message
{
get { return TempData["message"] as string; }
set { TempData ["message"] = value; }
}

protected override void OnException (ExceptionContext filterContext) {
Response.Clear();
base.OnException (filterContext);
}
}

当然,细心的朋友发现了该抽象类中还包括一个 IBaseControllerService接口实例。

该接口的主要定义了一些网店系统信息,如店铺名称,版权 信息,Email信息等,如下:

public interface IBaseControllerService
{
IRepository<Category> CategoryRepository { get; }
string GoogleTrackingCode { get; set; }
string ShopName { get; set; }
string EmailAddress { get; set; }
string SiteUrl { get; }
string MetaDescription { get; set; }
string Copyright { get; set; }
string PhoneNumber { get; set; }
string SiteCss { get; set; }
}

而作为唯一一个实现了该接口的子类“BaseControllerService”定义如下:

public class BaseControllerService : IBaseControllerService
{
public IRepository<Category> CategoryRepository { get; private set; }
public string GoogleTrackingCode { get; set; }
public string MetaDescription { get; set; }
private string shopName;
private string emailAddress;
private string copyright;
private string phoneNumber;
private string siteCss;

..
}

时间: 2024-08-19 00:17:23

Asp.net MVC示例项目“Suteki.Shop”分析之Controller的相关文章

Asp.net MVC示例项目“Suteki.Shop”分析之结束篇

到今天,这个系列的文章就要先告一段落了.其中我用了10篇文章也没有穷尽该项目的设计思想,只 能从中捡了一些我感兴趣的东西进行了分析和说明,正所谓兴趣是最大的动力.当然限于本人水平有限 ,难免有一些认识上的错误,也希望大家在回复中与我进行交流. 下面把一些还未穷尽的内容做一下罗列,以备感兴趣的朋友继续品味. 1.项目中使用了"Rhino.Mocks",有对单元测试和这个项目感兴趣的朋友可以通过测试 代码研究一下. 2.在下面三个文件夹下有大量的辅助类和扩展方法,其中有些代码大家可以很容易

Asp.net MVC示例项目“Suteki.Shop”分析之安装篇

作为这个系列的开篇,本系统会将我在研究这个项目源码中的一些思考和心得介绍给大家. 当然本系统决不是那种所谓的"最佳示范",里面所提到的使用技巧或设计思路只是给大家 在实际工作中提供一个参考,所谓"最好"之类的词汇都是"矬子里拔将军", 相信大家在成功的分析了几个MVC示例之后,会找到适合自己所在团队或公司使用的方式或思路的. 其 实在找一个合适的MVC示例上我已花费了"一些"时间,而这个例子对于我来说,还是相对不 错的(除了文

Asp.net MVC示例项目“Suteki.Shop”分析之IOC(控制反转)

在Suteki.Shop中,未使用微软自已的Unity框架来实现IOC,而是使用了大名鼎鼎Castle Windsor. 因为引用了Windsor,就有必要简要介绍一下.而我的理解,这个IOC容器(Container)包括下 面几个重要概念: 容器(Container):Windsor是一个反转控制容器.它创建在一个微内核的基 础之上,这个微内核能够扫描类并且试图找到这些类用到哪些对象引用.对象依赖,然后把这些依赖信 息提供给类使用. 组件(Component):也就是我们通常所说的业务逻辑单元

Asp.net MVC示例项目“Suteki.Shop”分析之ViewData

使用强类型的ViewData好处有许多,比如说在IDE中就会有更好的支持,比如代码提示.同时在View 与Controller之间有更严谨的"约定".在Suteki.Shop项目中作者对强类型的ViewPage引入 是通过MvcContrib实现的,下面就是其ViewPage<T>代码(Suteki.Shop\Views\ViewPage.cs): public class ViewPage<T> : MvcContrib.FluentHtml.ModelVie

Asp.net MVC示例项目“Suteki.Shop”分析之NVelocity模版引擎

在Suteki.Shop中使用了NVeloctiy模版引擎,用于提供可订制的邮件模版.而邮件的功能就是当定单 状态发生变化时,系统会向买家发送邮件通知.其中的邮件信息内容就是采用NVeloctiy的模版(.vm扩 展名)进行订制的. 因为在Sutekie.Shop的最新源码包中只是部分实现了其功能,而全部的功能 还在完善中,所以要运行本文中所说的功能,需要在下面的链接地址中下载其最新程序文件(包括单元 测试文件): http://code.google.com/p/sutekishop/sour

Asp.net MVC示例项目“Suteki.Shop”分析之NHibernate

在Suteki.Shop中内置了提供了基于NHibernate方式的ORM功能,只不过就目前的项目进度还未全部完 成其设计时的构想,另外在单元测试上也没有完整的测试.不过其设计思路还是很有意思的. 就 其将NHibernate引入到项目中的实现方式而言,与Rhino.Commons中所提倡的方式如出一辙,那就是基于 IRepository模式.关于IRepository这个接口的定义在之前的这篇文章中已提到并做了相应说明,所以 这里就不多做解释了. 好了,下面就开始今天的正文. 首先让我们看一下

Asp.net MVC示例项目“Suteki.Shop”分析之Filter

在Suteki.Shop中对于Filter的使用上提供了两种方式,一种是从FilterAttribute(抽象类属性)以及 接口 IActionFilter和 IResultFilter中继承并实现.另一种是我们经常提到的从 ActionFilterAttribute 上继承方式来实现自己的ActionFilter.首先看一下第一种,同时它也是该项 目中被Action广泛使用的方式, 下面是类图: 当然图中最核心的 当属FilterUsingAttribute,它同时继承了 FilterAttr

Asp.net MVC示例项目“Suteki.Shop”分析之数据验证

在Suteki.Shop,实现了自己的数据校验机制,可以说其设计思路还是很有借鉴价值的.而使用这种 机制也很容易在Model中对相应的实体对象(属性)添加校验操作方法.下面就来介绍一下其实现方式. 首先,看一下这样类图: 在Suteki.Shop定 义一个"IValidatingBinder"接口,其派生自IModelBinder: 其接口中定义了一个 重载方法UpdateFrom,其要实现的功能与MVC中UpdateFrom一样,就是自动读取我们在form中定义的有些 元素及其中所包

Asp.net MVC示例项目“Suteki.Shop”分析之Model和Service

在Suteki.Shop中Model的原型是基于Linq to SQL创建的,其dbml文件位于Suteki.Shop\Shop.dbml. 而Suteki.Shop在此文件的基本上,以"partial class "的方式在Suteki.Shop\Model文件夹下 创建了相应的类文件以扩展Shop.dbml中Model类的一些方法和属性声明,如下图: 为了便于 大家理解,下面以Model中的Product.cs为例进行说明. Product是对网站中所销售商品的数据信 息类.在其中