使用Spring.NET对ASP.NET MVC中的Controller进行属性的依赖注入可以实现UI层和BLL层的完全解耦,下面通过一个简单的例子来做演示:
1.下载相关的程序集,点击下载,其中还有很多相关的文档、示例和源码,本文也是根据其中一个Demo写的;
2.新建一个MVC3的项目,添加一个Home控制器,然后在自动添加的Index Action上添加一个视图,并在Home控制器下添加一个string类型的属性Message,然后通过一个key为MSG的视图数据将Message传递到视图上面去,最后视图将其显示出来;
1 public class HomeController : Controller 2 { 3 // 4 public string Message { set; get; } 5 6 // 7 // GET: /Home/ 8 9 public ActionResult Index() 10 { 11 ViewData["MSG"] = Message; 12 return View(); 13 } 14 15 }
Views/Index.cshtml
1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <title>Index</title> 10 </head> 11 <body> 12 <div> 13 <h2>@ViewData["MSG"]</h2> 14 </div> 15 </body> 16 </html>
3.引用程序集(下载文件路径:\Spring.NET-2.0.0-M2\Spring.NET\bin\net\4.0\release)
4.改变HttpApplication对象,这是关键所在;
1 public class MvcApplication : SpringMvcApplication 2 { 3 //.... 4 }
5.添加配置信息
1 <configSections> 2 <sectionGroup name="spring"> 3 <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3"/> 4 </sectionGroup> 5 </configSections> 6 7 <spring> 8 <context> 9 <resource uri="file://~/Configs/ControllerObjects.xml"/> 10 </context> 11 </spring>
resource节点下面的uri指向的是另一个配置文件:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net"> 3 <object type="SimpleDemo.Web.Controllers.HomeController, SimpleDemo.Web" singleton="false" > 4 <property name="Message" value="欢迎试用ASP.NET MVC3" /> 5 </object> 6 </objects>
请求Home控制器下的Index,得到如下的返回:
说明:之所以要将Globel文件中将HttpApplication的父类替换成SpringMvcApplication,因为它为我们指定了一个ControllerFactory,该工厂在创建控制器对象的时候根据我们在配置文件中的配置创建对象、为属性赋值(这里为Message赋值),也许有人会说费这么大的周折是为了哪一出啊,直接在控制器中给Message赋值不就可以了吗?但是,我们要知道该配置文件比改代码的代价要小得多的。另外,这里只是做了一个演示,所以只是对一个string属性做依赖注入,同样,我们完全可以对一个IBLL层的属性进行注入,这样UI层就完全不关心你业务逻辑层的具体实现了(拿到的只是一个IBLL层的接口),然后在切换具体的业务层实现的时候只需要修改配置文件即可(可以是本机的实现,也可以是某个Web服务)。