通過註冊允許容器解析控制器的控制器工廠,您可以使用IoC容器爲您解析映射 - 容器將解析控制器類型並注入接口的具體實例。
例在MvcApplication
類使用Castle Windsor
在Global.asax中
:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());
}
WindsorControllerFactory
類
using System;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
using System.Web.Routing;
using Castle.Core.Resource;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
public class WindsorControllerFactory : DefaultControllerFactory
{
WindsorContainer container;
public WindsorControllerFactory()
{
container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
foreach (Type t in controllerTypes)
container.AddComponentWithLifestyle(t.FullName, t, Castle.Core.LifestyleType.Transient);
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
// see http://stackoverflow.com/questions/1357485/asp-net-mvc2-preview-1-are-there-any-breaking-changes/1601706#1601706
if (controllerType == null) { return null; }
return (IController)container.Resolve(controllerType);
}
}
羞於承認我從來沒有聽說過的IoC容器。我從來沒有碰過依賴注入。你能給我一個解釋和例子,說明它的使用方法嗎? – GenericTypeTea 2010-05-08 20:48:39
控制反轉(IoC)通過管理類型之間的依賴來幫助構建鬆散耦合的系統 - 很多時候對象可以依賴於其他對象,例如,控制器依賴於存儲庫來填充模型。這些依賴關係可以使用IoC容器進行管理,以便當某個類型需要另一個類型的實例時,它會向容器請求它,並且該容器將返回它被配置爲返回的類型的實例... – 2010-05-08 21:08:38
例如,您的控制器想要一個'ICustomerRepository'的具體實例,所以它要求它的容器。儘管我們可以進一步推進,但我們也可以讓容器管理控制器的實例化。我們在這裏獲得的好處以及使用IoC容器的衆多原因之一是,在實例化控制器時,容器會意識到它具有對「ICustomerRepository」的依賴並實例化它(也稱爲依賴注入) 。 – 2010-05-08 21:12:47