在ASP.NET MVC中设置控制(IOC)的反转与温莎城堡 [英] Setting up Inversion of Control (IoC) in ASP.NET MVC with Castle Windsor
问题描述
我要在桑德森的临ASP.NET MVC框架,并在第4章,他讨论<一个href=\"http://books.google.com/books?id=tD3FfFcnJxYC&pg=PA97&lpg=PA97&dq=Castle+Windsor+Creating+a+Custom+Controller+Factory&source=bl&ots=IQiNwtzGUy&sig=nFMxJjIshKcMTKjb_JgWN4xB7fo&hl=en&ei=6kloTZG1BYyRgQfgzZTOCg&sa=X&oi=book_result&ct=result&resnum=6&ved=0CDoQ6AEwBQ#v=onepage&q=Castle%20Windsor%20Creating%20a%20Custom%20Controller%20Factory&f=false\">Creating自定义控制器厂,似乎原来的方法, AddComponentLifeStyle
或 AddComponentWithLifeStyle
,用于注册控制器德是$ p $现在pcated:
I'm going over Sanderson's Pro ASP.NET MVC Framework and in Chapter 4 he discusses Creating a Custom Controller Factory and it seems that the original method, AddComponentLifeStyle
or AddComponentWithLifeStyle
, used to register controllers is deprecated now:
public class WindsorControllerFactory : DefaultControllerFactory
{
IWindsorContainer container;
public WindsorControllerFactory()
{
container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
// register all the controller types as transient
var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
where typeof(IController).IsAssignableFrom(t)
select t;
//[Obsolete("Use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)) instead.")]
//IWindsorContainer AddComponentLifeStyle<I, T>(string key, LifestyleType lifestyle) where T : class;
foreach (Type t in controllerTypes)
{
container.Register(Component.For<IController>().ImplementedBy<???>().Named(t.FullName).LifeStyle.Is(LifestyleType.Transient));
}
}
// Constructs the controller instance needed to service each request
protected override IController GetControllerInstance(Type controllerType)
{
return (IController)container.Resolve(controllerType);
}
}
新的建议是使用<$c$c>Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle))$c$c>,但我无法弄清楚如何present在 ImplementedBy&LT执行控制器类型; ???&GT;()
方法。我试图 ImplementedBy&LT; T&GT;()
和 ImplementedBy&LT; typeof运算(T)&GT;()
,但我可以'找不到合适的方式实施类型来传递。任何想法?
The new suggestion is to use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle))
, but I can't figure out how to present the implementing controller type in the ImplementedBy<???>()
method. I tried ImplementedBy<t>()
and ImplementedBy<typeof(t)>()
, but I can't find the appropriate way to pass in the implementing type. Any ideas?
推荐答案
我用这样的<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspx\"><$c$c>ControllerBuilder.SetControllerFactory$c$c>和code可以在开源项目中找到 MvcContrib :
的Global.asax.cs
protected void Application_Start()
{
...
IWindsorContainer windsorContainer = new WindsorContainer();
windsorContainer.RegisterControllers(Assembly.GetExecutingAssembly());
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(windsorContainer));
...
}
WindsorControllerFactory
public class WindsorControllerFactory : DefaultControllerFactory
{
private readonly IWindsorContainer _container;
public WindsorControllerFactory(IWindsorContainer container)
{
if (container == null)
{
throw new ArgumentNullException();
}
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException();
}
if (!typeof(IController).IsAssignableFrom(controllerType))
{
throw new ArgumentException();
}
try
{
return (IController)_container.Resolve(controllerType);
}
catch (Exception ex)
{
throw new InvalidOperationException();
}
}
public override void ReleaseController(IController controller)
{
IDisposable disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
_container.Release(controller);
}
}
WindsorExtensions (见<一href=\"http://mvccontrib.$c$cplex.com/SourceControl/changeset/view/9f50eec32eb7#src%2fMvcContrib.Castle%2fWindsorExtensions.cs\">MvcContrib)
public static class WindsorExtensions
{
public static IWindsorContainer RegisterController<T>(this IWindsorContainer container) where T : IController
{
container.RegisterControllers(typeof(T));
return container;
}
public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Type[] controllerTypes)
{
foreach (Type type in controllerTypes)
{
if (ControllerExtensions.IsController(type))
{
container.Register(Component.For(type).Named(type.FullName).LifeStyle.Is(LifestyleType.Transient));
}
}
return container;
}
public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Assembly[] assemblies)
{
foreach (Assembly assembly in assemblies)
{
container.RegisterControllers(assembly.GetExportedTypes());
}
return container;
}
}
ControllerExtensions (见<一href=\"http://mvccontrib.$c$cplex.com/SourceControl/changeset/view/9f50eec32eb7#src%2fMVCContrib%2fControllerExtensions.cs\">MvcContrib)
public static class ControllerExtensions
{
public static bool IsController(Type type)
{
return type != null
&& type.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)
&& !type.IsAbstract
&& typeof(IController).IsAssignableFrom(type);
}
}
这篇关于在ASP.NET MVC中设置控制(IOC)的反转与温莎城堡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!