SportsStore是《精通ASP.NET MVC3框架(第三版)》中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器、URL优化、导航、分页、购物车、订单、产品管理、图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离。本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能。

本篇为系列第三篇,包括:

■ 5、自定义Ninject控制器工厂
■ 6、项目的第一次运行

5、自定义Ninject控制器工厂

在MySportsStore.WebUI下添加如下引用:

● 添加对Ninject的引用
● 添加对MySportsStore.IBLL的引用
● 添加对MySportsStore.BLL的引用
● 添加对MySportsStore.Model的引用

创建NinjectControllerFactory:

using System.Web.Mvc;
using MySportsStore.BLL;
using MySportsStore.IBLL;
using Ninject;namespace MySportsStore.WebUI.Extension
{public class NinjectControllerFactory : DefaultControllerFactory{private IKernel ninjectKernel;public NinjectControllerFactory(){ninjectKernel = new StandardKernel();AddBindings();}protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, System.Type controllerType){return controllerType == null ? null : (IController) ninjectKernel.Get(controllerType);}private void AddBindings(){ninjectKernel.Bind<IProductService>().To<ProductService>();}}
}

在全局中注册NinjectControllerFactory

public class MvcApplication : System.Web.HttpApplication{protected void Application_Start(){......ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}}

为什么需要NinjectControllerFactory?
Ninject这个DI容器可以帮我们很好地管理接口和实现,并且以属性或构造函数的形式注入到控制器中,从而调用接口实现类的方法。并且,Ninject提供了Get()方法,使得使用Ninject也可以创建Controller。

6、项目的第一次运行

创建BaseController,其中赋予手动垃圾回收的机制。

using System;
using System.Collections.Generic;
using System.Web.Mvc;namespace MySportsStore.WebUI.Controllers
{public class BaseController : Controller{protected IList<IDisposable> DisposableObjects { get; private set; }public BaseController(){this.DisposableObjects = new List<IDisposable>();}protected void AddDisposableObject(object obj){IDisposable disposable = obj as IDisposable;if (disposable != null){this.DisposableObjects.Add(disposable);}}protected override void Dispose(bool disposing){if (disposing){foreach (IDisposable obj in this.DisposableObjects){if (null != obj){obj.Dispose();}}}base.Dispose(disposing);}}
}

当其它的Controller派生于BaseController时,如果用到类型为IXXXService的XXXService,就通过BaseController的AddDisposableObject(object obj)把该XXXService放到BaseController中的DisposableObjects集合属性中,在使用Dispose()销毁这些XXXService。

而在BaseService中也提供了手动垃圾回收机制,可以及时回收CurrentRepository。

最后在BaseRepository中也提供了手动垃圾回收机制,可以及时回收EF上下文。

创建ProductController,使之派生于BaseController:

using System.Web.Mvc;
using MySportsStore.IBLL;
using Ninject;namespace MySportsStore.WebUI.Controllers
{public class ProductController : BaseController{[Inject]IProductService ProductService { get; set; }public ProductController(){this.AddDisposableObject(ProductService);}public ViewResult List(){return View(ProductService.LoadEntities(p => true).AsQueryable());}}
}

对应的Prduct/List.cshtml视图为:

@model IEnumerable<MySportsStore.Model.Product>@{ViewBag.Title = "List";Layout = "~/Views/Shared/_Layout.cshtml";
}@foreach (var item in Model)
{<div class="item"><h3>@item.Name</h3>@item.Description<h4>@item.Price.ToString("c")</h4></div>
}

为了能够让EF在第一次运行的时候自动创建数据库并显示,我们还需要在MySportsStore.WebUI中的Web.config中配置连接字符串:

<connectionStrings>......<add name="conn"connectionString="Data Source=.;User=some user name;Password=some password;Initial Catalog=MySportsStore;Integrated Security=True"providerName="System.Data.SqlClient"/></connectionStrings>

修改默认路由为:

routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional });

运行,得到如下界面:

在数据库中也新增了MySportsStore数据库:

源码在这里。

“MVC项目实践,在三层架构下实现SportsStore”系列包括:

MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

MVC项目实践,在三层架构下实现SportsStore-04,实现分页

MVC项目实践,在三层架构下实现SportsStore-05,实现导航

MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交

MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

MVC项目实践,在三层架构下实现SportsStore-10,连接字符串的加密和解密

MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查

转载于:https://www.cnblogs.com/darrenji/p/3811511.html

MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等相关推荐

  1. MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  2. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  3. CS通用项目系统搭建——三层架构第一天

    CS通用项目:使用三层架构进行搭建 三层架构: 表现层(UI(User Interface)):展示给用户的层面,包含窗体控件数据等信息. 业务逻辑层(BLL(Business Logic Layer ...

  4. java三层架构项目事例_三层架构实例

    一.概要 在我的上一篇博客中,我们谈了谈分层,到底为什么分层(http://blog.csdn.net/shan9liang/article/details/6836300) 这篇博客,准备用一个小D ...

  5. Javaweb MVC设计模式、Modle发展史、项目分层和三层架构

    文章目录 MVC设计模式 MVC的目的 MVC举例 jsp+servlet+javabean模式 MVC的优点 MVC的缺点 Modle 发展史 项目分层 三层架构 MVC设计模式 MVC模式(Mod ...

  6. 什么是MVC?什么是三层架构?

    什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图与业务 ...

  7. SSM框架实战详细教程(十四)贯穿项目实战之三层架构

    之前我们的项目足够简单,所以使用的是两层架构,现在为了学习Spring,需要使用行业中常见的三层架构,关于分层开发的原则请看下图:         本次对项目的调整,主要是由之前的controller ...

  8. 三层架构下,优酷视频搜索测试体系很复杂吗?

    作者| 阿里文娱测试开发专家 熙闫 责编 | 夕颜 简介 优酷搜索承担着内容分发场的头部兵的重任,海量的视频内容都要依赖搜索触达和呈现给 用户,而且逐渐扩大范围,开始向阿里文娱全系产品提供搜索服务和能 ...

  9. unity 项目实践经验 和 架构体系

    GameRes游资网授权发布 文 / 吴秦(Tyler) 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: ...

最新文章

  1. Json的list、map、对象对应格式
  2. secureCrt开启oracle
  3. 设计立方体类(求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等)
  4. 如何解决Android studio已分享到github的项目但是git->commit directory提交不上去
  5. 飞秋爱好者(WZ132)
  6. git的简单操作指令
  7. Java中equals()方法和==的区别分析
  8. 2017⇆2019,用了这款减肥App,我胖了30斤...
  9. RabbitMq之发布订阅模式
  10. 论文阅读|Lightweight OpenPose
  11. 制作png格式透明图片的简易方法
  12. 轻量级目标检测算法整理
  13. python tokenize()_tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)...
  14. 快到假期了,还抢不到票?可以试试这两个工具
  15. 浅谈DM数据库优化常识
  16. 论文阅读 激光脉冲主动非视距成像+深度学习 || Learned Feature Embeddings for Non-Line-of-Sight Imaging and Recognition
  17. 刘海屏启动空白页适配全面屏
  18. 2017-美团大众点评-安全工程师A/B卷
  19. redis安装(主从)
  20. C语言-自动识别用户输入的字符串并便于后期处理

热门文章

  1. 1个ieee1394端口_ieee1394接口是什么及作用
  2. Qt--qss(暗橙色)
  3. Redis源码剖析(四)过期键的删除策略
  4. 记录flink和spark提交任务常用句
  5. 学习C++ - 类(Classes)的定义与实现
  6. IPython Notebook简介1
  7. 牛客练习赛34 E little w and Digital Root(数位dp)
  8. mysql更新视图的时候有时候可以不满足视图条件的值也能更新成功
  9. initrd.img相关
  10. 为什么在mysql执行删除表中外键的语句,外键却仍然存在? [问题点数:40分]