ASP.NET MVC 控制器激活(二)

时间:2021-11-27 23:31:07

ASP.NET MVC 控制器激活(二)

前言

在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉及到的对象模型,今天的篇幅就是在激活的过程中,框架提供了哪些可注入点,站在一个使用者的角度来进行描述。

激活控制器-注入点入口

ASP.NET MVC 控制器激活(二)

如上图,这是上个篇幅中描述的控制器激活过程图,这里引用过来是怕有的朋友忘记了前面的所说和没看过前面篇幅的朋友。

就从默认控制器工厂的实现来看,在CreateController()方法中,通过GetControllerType()方法来获取控制器类型(Type),然后传递到GetControllerInstance()方法中,通过其中的实现来完成根据控制器类型(Type)到IController的生成。而在后续的注入点也是在GetControllerInstance()方法实现中来进行注入的,GetControllerInstance()方法即是整个控制器激活过程的入口点。

IoC示例

既然说到了动态注入,想必就要用到IoC框架了,在MVC学前篇中提到过Ninject的使用,下面这个示例便是依赖于Ninject的来做的演示:

     /// <summary>
/// 产品实体类
/// </summary>
public class Product
{
public string ID { get; set; }
public string Name { get; set; }
}

定义一个数据实体类没什么好说的,

     /// <summary>
/// 抽象数据提取库
/// </summary>
public interface IDataStandard
{
List<Product> GetProducts();
}
/// <summary>
/// 默认实现--数据提取库
/// </summary>
public class DataProvide : IDataStandard
{ public List<Product> GetProducts()
{
List<Product> products = new List<Product>()
{
new Product(){ ID="",Name="name1"},
new Product(){ID="",Name="name2"},
new Product(){ID="",Name="name3"}
};
return products;
}
}

这里定义的一个是抽象的数据提取库,和一个默认的实现作为演示用于提供数据用的。

     /// <summary>
/// 抽象数据调用
/// </summary>
public interface IDataCall
{
void WriterToMonitor();
} /// <summary>
/// 默认的数据调用实现
/// </summary>
public class DefultDataCall:IDataCall
{
private IDataStandard _DataStandard; public DefultDataCall(IDataStandard dataStandard)//使用构造函数方式注入 通过Ninject框架实现
{
_DataStandard = dataStandard;
} public void WriterToMonitor()
{
foreach(var data in _DataStandard.GetProducts())
{
Console.WriteLine("Prodcut ID:" + data.ID + " Name:" + data.Name);
}
}
}

这里定义的是抽象的数据调用和默认的实现,我们现在要做的就是通过IoC框架来让调用客户端对数据调用和数据提取解耦,

 class Program
{
static void Main(string[] args)
{
IKernel ninject = new StandardKernel();
ninject.Bind<IDataStandard>().To<DataProvide>();
IDataCall dataCall = ninject.Get(typeof(DefultDataCall)) as IDataCall;
if (dataCall != null)
{
dataCall.WriterToMonitor();
} Console.ReadLine();
}
}

运行这段代码:

ASP.NET MVC 控制器激活(二)

很简单明了的一个示例,在MVC的项目中也是这样运行的。

MVC项目中的运用

在上面的章节里说过,入口点在protected internal virtual IController GetControllerInstance(RequestContext requestContext, Type controllerType);方法中,我们只需要实现一个默认的控制器工厂类型,并且重写一下这个方法,因为我们已经可以在重写的方法中获取到控制器的类型了,有了它就可以按照IoC示例中的那样来进行其它对象到控制器的一个动态注入。

我们先要定义一个控制器,并且要让它对上述示例中的抽象提取库依赖,采取构造函数式注入(依赖)。

看一下示例:

     public class IoCDemoController : Controller
{
//
// GET: /IoCDemo/ private IDataStandard _DataStandard; public IoCDemoController(IDataStandard dataStandard)
{
_DataStandard = dataStandard;
} public ActionResult Index()
{
return View(_DataStandard.GetProducts());
}
}

在Index方法上右键,点击添加视图:

ASP.NET MVC 控制器激活(二)

点击添加,并且在视图中输入如下代码:

@model IEnumerable<ConsoleApplication2.Product>

@{
ViewBag.Title = "Index";
} <h2>Index</h2>
@foreach (var item in Model)
{
<h3>ID: @item.ID Name:@item.Name</h3>
}

再把Global.asax文件中的路由设置修改一下:

 routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "IoCDemo", action = "Index", id = UrlParameter.Optional } // 参数默认值
);

这个时候准备工作都做好,可是控制器中所用的数据哪里来呢?从我们默认实现的控制器工厂中来:

     public class NinjectControllerFactory :DefaultControllerFactory
{
private IKernel _NinjectKernel; public NinjectControllerFactory()
{
_NinjectKernel = new StandardKernel();
_NinjectKernel.Bind<IDataStandard>().To<DataProvide>();
} protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
IController controller = _NinjectKernel.Get(controllerType) as IController;
if (controller != null)
{
return controller;
}
return null;
} }

按照上面章节中的样式,在NinjectControllerFactory中事先绑定数据类型,等到系统执行需要用到控制器的时候会通过Ninject框架来讲数据动态的注入到控制器中。

最后还要设置一项:

在Global.asax文件中的Application_Start()方法中要把我们默认的实现的控制器工厂设置到MVC框架中,

 protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

添加上代码的最后一句。现在我们就可以来看一下最终效果了。

ASP.NET MVC 控制器激活(二)

本篇就讲到这里,会在下个篇幅中继续讲解其他的注入点。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 控制器激活(二)的更多相关文章

  1. 使用Code First建模自引用关系笔记 asp&period;net core上使用redis探索&lpar;1&rpar; asp&period;net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

  2. ASP&period;NET MVC 控制器激活&lpar;一&rpar;

    ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...

  3. ASP&period;NET MVC 控制器激活&lpar;三&rpar;

    ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControllerInstanc ...

  4. asp&period;net mvc控制器激活全分析

    控制器的激活默认情况下使用反射来实现的,这其中采用了DI,单例等设计模式.对于控制器的主要涉及到如下的类:ControllerBuilder.DefaultControllerFactory.Defa ...

  5. MVC 控制器激活

    MVC 控制器激活 ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControl ...

  6. 学习ASP&period;NET MVC&lpar;二&rpar;——我的第一个ASP&period;NET MVC 控制器

    MVC全称是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑和数据显示分离的方法组织代码,将 ...

  7. ASP&period;NET MVC 描述类型&lpar;二&rpar;

    ASP.NET MVC 描述类型(二) 前言 上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor ...

  8. ASP&period;NET MVC Model验证&lpar;二&rpar;

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  9. ASP&period;NET MVC Model绑定&lpar;二&rpar;

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

随机推荐

  1. 在Github上搭建自己的博客&lpar;Windows平台&rpar;

    折腾了好久,终于在Github上搭建了自己的博客.这里面总结一下过程希望对大家能有所帮助. Github建博优缺点 和 csdn,新浪,网易相比,在Github上可以自己实现功能 和阿里云,VPS相比 ...

  2. JS图片切换效果

    源地址:http://www.codefans.net/jscss/code/4699.shtml <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  3. 日志框架对比 NLog VS Log4net

    Log4net 先说Log4net,它是.net平台上一个老牌的日志框架,我接触的时间也不长(因为公司有自己的日志库),但是看着各开源库都在用这个于是前段时间也尝试去了解了一下. 首先让我认识到Log ...

  4. Ubuntu 12&period;04 中安装和配置 Java JDK

    先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-7u4-linux-i586.tar.gz文件,下好后直接解压 sudo mv ./jdk1.7.0_55 /usr/lib/jdk ...

  5. freemarker的非空判断

    ${price} 判断非空写法就是 ${(price)!}

  6. Web前端开发实用的Chrome插件

    Web前端开发实用的Chrome插件 越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录 ...

  7. Windows修改hosts文件及位置

    文件位置 C:\Windows\System32\drivers\etc 中的hosts文件 修改方式 指定IP 域名 192.168.66.7 www.baidu.com

  8. iOS搜索框UISearchBar 分类: ios技术 2015-04-03 08&colon;55 82人阅读 评论&lpar;0&rpar; 收藏

    当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...

  9. 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。

    一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...

  10. 二、ionic如何使用外链

    1.ionic如何使用外链并返回原有页面? html如下: 对应的controller如下: (function() { angular.module('app').controller('extra ...