一、闲话
因为项目要用到Ioc框架,所以要为Ioc框架选型,优秀的Ioc框架好几款,例如:sping.net,castle,unity……当然还不止三款,还有其它的Ioc框架,castle跟unity使用上比较相近,spring.net跟前两者使用上差异较大些。资料、文档和博文方面spring.net>castle>unity。这三个都有大的强大的团队支持,我感觉spring.net做得最好,无论更新力度、文档和示例都很给力。
鉴于spring.net的功能、资料文档、博文等比较完善丰富,再加上本人对spring.net相对较熟悉一些,人员培训等都较容易,因此选用了spring.net作为项目的Ioc框架。
二。Spring.net与Asp.net MvC结合的入门示例
1)依赖组件
这里需要用到Spring.net以下组件:
Common.Logging.dll
Spring.Core.dll
Spring.Web.Mvc.dll
2)环境搭建
入门示例习惯都从Hello world开始,这次也不例外
首先,创建一个Asp.net mvc项目:
我们在Model文件夹里新建一个IHello接口和一个Hello实现类
IHello接口
public interface IHello
{
string SayHelloWorld();
}
Hello实现类
public class Hello : IHello
{
public string SayHelloWorld()
{
return "Hello World!";
}
}
在SayHelloWorld方法中return了一个字符串”Hello world!”。
让我们来测试它吧,在HomeController里我们写下如下代码:
HomeController类
public class HomeController : Controller
{
public IHello hello = new Hello();
public ActionResult Index()
{
ViewBag.Message = hello.SayHelloWorld();
return View();
}
public ActionResult About()
{
return View();
}
}
我们实例化了一个Hello对象,硬编码的方式,先运行一下看看效果:
上面运行一切正常,好了让我们来引入spring.net
3)引入spring组件
上面提到的spring.net的组件引入到工程里面来:
4)修改web.config添加Spring配置:
web.config
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc"/>
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="~/Configs/Spring.xml"/>
</context>
</spring>
我们引用了另外的一个xml文件Spring.xml,用于配置对象和设置相关依赖。
5)移除掉具体的实现
在配置对象之前,我们先把HomeController代码改一改,移除掉具体的实现:
public class HomeController : Controller
{
public IHello Hello { get; set; }
public ActionResult Index()
{
ViewBag.Message = this.Hello.SayHelloWorld();
return View();
}
public ActionResult About()
{
return View();
}
}
6)配置对象和设置相关依赖
Spring.xml
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object id="Hello" type="SpringMvcApp.Models.Hello, SpringMvcApp"/>
<object type="SpringMvcApp.Controllers.HomeController, SpringMvcApp" singleton="false">
<property name="Hello" ref="Hello"/>
</object>
</objects>
这里需要注意一点的是,对象默认配置是单例的,Controller不是单例的,所以这里把singleton设置为false。
是否这样就已经配置完成了,让我们来测试一下。
很遗憾,并没得到我们想要的对象实例。
7)继承Spring.Web.Mvc.SpringMvcApplication类
喀,好像忘了些什么,仅仅只是配置配好了,spring.net的容器还没有接管这一切……
在这我们只需要让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication类即可,根据需要override相关方就可以了,很简单是吧。
MvcApplication类
public class MvcApplication : Spring.Web.Mvc.SpringMvcApplication
{
protected override void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
}
改好后,我们再运行一下程序,这下有木有?
---------------------------------
[Spring.NET IoC] 之一:基本信息
Spring.NET 移植自著名的 Java 开源项目 —— Spring,借助于 .NET 强大的反射机制,甚至拥有比原 Java 版本更强大的功能。只是不知道什么原因,在 .NET 领域似乎没有多少热度,其影响力甚至不如 Castle。因准备在个人项目中使用 IoC,因此花些时间对 Spring.NET 和 Castle 都作一些了解,本文权作学习笔记。
Spring.NET 的宣传口号中有 "non-invasiveness. Quite simply" 的字样,表示是非入侵且易用的,当然作为一个IoC容器,这些都是最基本的特征。
在 Spring.NET IoC 中最核心的内容应该是 IObjectFactory、IApplicationContext、IObjectDefinition 这三个接口了。IObjectFactory 是核心容器接口,负责管理容器内的注入对象,而 IApplicationContext 则是 IObjectFactory 的继承,它扩展了一些功能。IObjectDefinition 是注入对象的定义接口,供 IObjectFactory / IApplicationContext 调用。
大多数时候我们会选择 IApplicationContext 接口的实现类来操控 Spring.NET IoC 容器。
1. Spring.Context.Support.ContextRegistry
将配置信息写入 app.config / web.config 时所使用该类。
2. Spring.Context.Support.XmlApplicationContext
使用独立的 xml 配置文件,或者使用多个 xml 配置文件时,使用该类。
3. Spring.Context.Support.StaticApplicationContext
直接在代码中装配容器时,使用该类。
当然,你还可以使用 Spring.Objects.Factory.Xml.XmlObjectFactory 等直接实现 IObjectFactory 的类型。
作为该篇的结束,写一个简单的 "Hello World" 尝试一下。
using System; using System.Collections.Generic; using System.Text; using System.Threading; using Spring.Core; using Spring.Context; using Spring.Context.Support; namespace ConsoleApplication1.SpringNet { public class HelloWorld { public override string ToString() { return "Hello, World!"; } } public class Program { static void Main(string[] args) { StaticApplicationContext context = new StaticApplicationContext(); context.RegisterPrototype("HelloWorld", typeof(HelloWorld), null); object o = context.GetObject("HelloWorld"); Console.WriteLine(o); } } }