IOC 容器在 ASP.NET MVC 中的应用

IOC:Inversion Of
Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作来完成我们定义的系统的业务逻辑。哪么每一个构件可能相互独立和相互依赖,如果相互依赖的构件中的某一个构件出现异常,就会影响到整个系统的稳定运行,对象之间的耦合关系是无法避免的,也是必要的,因为这是协同工作的基础。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,IOC
的理念被提出,并被成功地应用到实践当中。说直白一点,就是对象之间的创建与维护我们全权交给了外部容器来管理,这样就实现了所谓的反转。

.NET
体系下这些相对成熟轻量级的IOC 容器,Castle
Windsor、Unity、Spring.NET、StructureMap和Ninject等,下面我们就开始演示IOC在ASP.NET MVC
下的应用,在这里我们选择 Castle 来做为 IOC 容器。ASP.NET
MVC 的 Controller
激活是靠ControllerFactory来创建的Controller对象的,所以我们就直接创建一个WindsorControllerFactory类,通过继承自DefaultControllerFactory来实现Controller的实例创建解析和释放等功能。


 1 using Castle.Core.Resource;
2 using Castle.Windsor;
3 using Castle.Windsor.Configuration.Interpreters;
4 using System;
5 using System.Linq;
6 using System.Reflection;
7 using System.Web.Mvc;
8
9 namespace mvc_with_Castle.App_Start
10 {
11 public class WindsorControllerFactory : DefaultControllerFactory
12 {
13 private WindsorContainer container;
14 public WindsorControllerFactory()
15 {
16 container = new WindsorContainer(
17 new XmlInterpreter(new ConfigResource("castle"))
18 );
19
20 var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
21 where typeof(IController).IsAssignableFrom(t)
22 select t;
23 foreach (Type t in controllerTypes)
24 container.AddComponentLifeStyle(t.FullName, t, Castle.Core.LifestyleType.Transient);
25 }
26
27 protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
28 {
29 return (IController)container.Resolve(controllerType);
30 }
31 }
32 }

一个自定义的WindsorControllerFactory就这么简单的创建完了,下一步创建一个基于 IWindsorInstaller
的对容器的安装类


using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using System.Web.Mvc;

namespace mvc_with_Castle.App_Start
{
public class ControllersInstaller : IWindsorInstaller
{
public void Install(Castle.Windsor.IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient().Configure(c => c.DependsOn()));
}
}
}

接下来我们对Global.asax做一些修改,注册我们默认的
WindsorControllerFactory
控制器工厂类。


 1 using Castle.Windsor;
2 using Castle.Windsor.Installer;
3 using mvc_with_Castle.App_Start;
4 using System.Web.Mvc;
5 using System.Web.Optimization;
6 using System.Web.Routing;
7
8 namespace mvc_with_Castle
9 {
10 public class MvcApplication : System.Web.HttpApplication
11 {
12 private static IWindsorContainer container;
13 private static void MyContainer()
14 {
15 container = new WindsorContainer().Install(FromAssembly.This());
16
17 var controllerFactory = new WindsorControllerFactory();
18 ControllerBuilder.Current.SetControllerFactory(controllerFactory);
19 }
20 protected void Application_Start()
21 {
22 AreaRegistration.RegisterAllAreas();
23 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
24 RouteConfig.RegisterRoutes(RouteTable.Routes);
25 BundleConfig.RegisterBundles(BundleTable.Bundles);
26
27 MyContainer();
28 }
29
30 protected void Application_End()
31 {
32 container.Dispose();
33 }
34 }
35 }

所有的准备工作差不多都准备完毕,接下来我们就来定义一个接口实现对人员的查询


 1 using System.Collections.Generic;
2
3 namespace mvc_with_Castle.Service
4 {
5 public class SysUser
6 {
7 public string Name { get; set; }
8
9 public string Sex { get; set; }
10
11 public string Phone { set; get; }
12
13 public string Address { get; set; }
14
15 public string Email { get; set; }
16 }
17
18 public interface IUsersSvr
19 {
20 IEnumerable<SysUser> QueryUsers();
21 }
22
23 public class UsersSvr : IUsersSvr
24 {
25 private static IList<SysUser> list;
26
27 static UsersSvr()
28 {
29 list = new List<SysUser>();
30 for (int i = 0; i < 10; i++)
31 {
32 list.Add(new SysUser()
33 {
34 Name = "如花" + i,
35 Sex = "男",
36 Phone = "13882880818",
37 Address = "皇后大道中段" + i + "号",
38 Email = "[email protected]"
39 });
40 }
41 }
42
43 public IEnumerable<SysUser> QueryUsers()
44 {
45 return list;
46 }
47 }
48 }

再下来就是我们对Castle IOC的配置管理


 1  <configSections>
2 <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>
3 </configSections>
4
5 <!--注册服务-->
6 <castle>
7 <components>
8 <component id="UsersSvr" type="mvc_with_Castle.Service.UsersSvr, mvc_with_Castle" service="mvc_with_Castle.Service.IUsersSvr, mvc_with_Castle" lifestyle="Singleton"/>
9 </components>
10 </castle>

最后调用我们定义的 IUserSvr 接口来实现查询数据


 1 using System.Collections.Generic;
2 using System.Web.Mvc;
3 using mvc_with_Castle.Service;
4
5 namespace mvc_with_Castle.Controllers
6 {
7 public class HomeController : Controller
8 {
9 public IUsersSvr _svr { get; set; }
10 public ActionResult Index()
11 {
12 IEnumerable<SysUser> list = _svr.QueryUsers();
13 return View(list);
14 }
15 }
16 }

人员信息显示效果如下 

在这里我们已经大概了解了什么是IOC容器,和在 ASP.NET MVC 下面我们怎样利用 IOC
容器来实现通过接口的方式来进行服务的调用的大致原理,在上面的HomeController里面,很明显我们不用担心接口怎么被实例化的,或者说我们没明白服务到底怎么被激活了,哪么再回头看看前面的代码是不是就一目了然了呢

时间: 2024-10-10 02:42:11

IOC 容器在 ASP.NET MVC 中的应用的相关文章

Unity容器在asp.net mvc中的IOC应用及AOP应用

<asp.net-mvc框架揭秘>一书中,有个示例,是使用unity容器来注入自定义的控制器工厂.代码示例可以自己去下载源码,在这里我就不说了.IOC容器的本质是解耦的实例化接口类,而如何做到解耦就是通过第三方容器来实例化,在这里是unity容器,而不是在项目中实例化接口类.实例化的方法无非就是反射,Emit,表达式树,委托等四个方法.Unity容器的IOC使用主要是三个个方法:Register,Resolver,Dispose.前者注册接口和接口类,后者将接口类的实例化转移到第三方容器中实现

Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac(转)

经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击"Manage NuG

[转] ASP.NET MVC 中你必须知道的 13 个扩展点

ScottGu 在其 最新的博文 中推荐了 Simone Chiaretta 的文章 13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了  ASP.NET MVC  中的 13 个扩展点.Keyvan Nayyeri(与Simone合著了 Beginning ASP.NET MVC 1.0 一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助.

在ASP.NET MVC中使用Castle Windsor

平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. 通过NuGet安装Castle Windsor. 在当前项目下创建一个名称为"IOC"的文件夹. 在ASP.NET MVC中,每次请求,DefaultControllerFactory都会为我们创建controller实例,我们需要自定义一个派生自DefaultControllerFact

ASP.NET MVC中简单使用Autofac

项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IProvinceRepository.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Libing.Portal.Web.Models { public i

log4net 使用总结- (2)在ASP.NET MVC 中使用

log4net在ASP.NET MVC中的配置,还有一种配置方式,即不在web.config中,而是单独新建一个log4net.config 在根目录下 第一.引用log4net.dll 第二.在站点根目录下增加log4net.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="

ASP.NET MVC中使用异步控制器

线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个版本,才能趋于规范. ASP.NET MVC 中为什么需要使用异步呢,IIS有一个线程池来处理用户的请求,当一个新的请求过来时,将调度池中的线程以处理该请求,然而,但并发量很高的情况下,池中的线程已经不能够满足这么多的请求时候,池中的每一个线程都处于忙的状态则在处理请求时将阻塞处理请求的线程,并且该

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用ASP.NE

ASP.NET MVC中使用FluentValidation验证实体

1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的验证方式,同时FluentValidation还提供了表达式链式语法. 2.安装FluentValidation FluentValidation地址:http://fluentvalidation.codeplex.com/ 使用Visual Studio的管理NuGet程序包安装FluentVa