MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
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控制器工厂等相关推荐
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- CS通用项目系统搭建——三层架构第一天
CS通用项目:使用三层架构进行搭建 三层架构: 表现层(UI(User Interface)):展示给用户的层面,包含窗体控件数据等信息. 业务逻辑层(BLL(Business Logic Layer ...
- java三层架构项目事例_三层架构实例
一.概要 在我的上一篇博客中,我们谈了谈分层,到底为什么分层(http://blog.csdn.net/shan9liang/article/details/6836300) 这篇博客,准备用一个小D ...
- Javaweb MVC设计模式、Modle发展史、项目分层和三层架构
文章目录 MVC设计模式 MVC的目的 MVC举例 jsp+servlet+javabean模式 MVC的优点 MVC的缺点 Modle 发展史 项目分层 三层架构 MVC设计模式 MVC模式(Mod ...
- 什么是MVC?什么是三层架构?
什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图与业务 ...
- SSM框架实战详细教程(十四)贯穿项目实战之三层架构
之前我们的项目足够简单,所以使用的是两层架构,现在为了学习Spring,需要使用行业中常见的三层架构,关于分层开发的原则请看下图: 本次对项目的调整,主要是由之前的controller ...
- 三层架构下,优酷视频搜索测试体系很复杂吗?
作者| 阿里文娱测试开发专家 熙闫 责编 | 夕颜 简介 优酷搜索承担着内容分发场的头部兵的重任,海量的视频内容都要依赖搜索触达和呈现给 用户,而且逐渐扩大范围,开始向阿里文娱全系产品提供搜索服务和能 ...
- unity 项目实践经验 和 架构体系
GameRes游资网授权发布 文 / 吴秦(Tyler) 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: ...
最新文章
- Json的list、map、对象对应格式
- secureCrt开启oracle
- 设计立方体类(求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等)
- 如何解决Android studio已分享到github的项目但是git->commit directory提交不上去
- 飞秋爱好者(WZ132)
- git的简单操作指令
- Java中equals()方法和==的区别分析
- 2017⇆2019,用了这款减肥App,我胖了30斤...
- RabbitMq之发布订阅模式
- 论文阅读|Lightweight OpenPose
- 制作png格式透明图片的简易方法
- 轻量级目标检测算法整理
- python tokenize()_tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)...
- 快到假期了,还抢不到票?可以试试这两个工具
- 浅谈DM数据库优化常识
- 论文阅读 激光脉冲主动非视距成像+深度学习 || Learned Feature Embeddings for Non-Line-of-Sight Imaging and Recognition
- 刘海屏启动空白页适配全面屏
- 2017-美团大众点评-安全工程师A/B卷
- redis安装(主从)
- C语言-自动识别用户输入的字符串并便于后期处理
热门文章
- 1个ieee1394端口_ieee1394接口是什么及作用
- Qt--qss(暗橙色)
- Redis源码剖析(四)过期键的删除策略
- 记录flink和spark提交任务常用句
- 学习C++ - 类(Classes)的定义与实现
- IPython Notebook简介1
- 牛客练习赛34 E little w and Digital Root(数位dp)
- mysql更新视图的时候有时候可以不满足视图条件的值也能更新成功
- initrd.img相关
- 为什么在mysql执行删除表中外键的语句,外键却仍然存在? [问题点数:40分]