asp.net-mvc – 使用Castle Windsor在ASP.NET MVC中设置控制反转(IoC)

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 使用Castle Windsor在ASP.NET MVC中设置控制反转(IoC)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在讨论Sanderson的Pro ASP.NET MVC框架,在第4章他讨论了 Creating a Custom Controller Factory,看来用于注册控制器的原始方法AddComponentLifeStyle或AddComponentWithLifeStyle现在已被弃用:
  1. public class WindsorControllerFactory : DefaultControllerFactory
  2. {
  3. IWindsorContainer container;
  4.  
  5. public WindsorControllerFactory()
  6. {
  7. container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
  8.  
  9. // register all the controller types as transient
  10. var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
  11. where typeof(IController).IsAssignableFrom(t)
  12. select t;
  13.  
  14. //[Obsolete("Use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)) instead.")]
  15. //IWindsorContainer AddComponentLifeStyle<I,T>(string key,LifestyleType lifestyle) where T : class;
  16. foreach (Type t in controllerTypes)
  17. {
  18. container.Register(Component.For<IController>().ImplementedBy<???>().Named(t.FullName).LifeStyle.Is(LifestyleType.Transient));
  19. }
  20. }
  21.  
  22. // Constructs the controller instance needed to service each request
  23. protected override IController GetControllerInstance(Type controllerType)
  24. {
  25. return (IController)container.Resolve(controllerType);
  26. }
  27. }

新的建议是使用Register(Component.For< I>().ImplementedBy< T>().Named(key).Lifestyle.Is(lifestyle)),但我无法弄清楚如何呈现实现控制器输入ImplementedBy< ???>()方法.我尝试了ImplementedBy< t>()和ImplementedBy< typeof(t)>(),但我找不到传递实现类型的适当方法.有任何想法吗?

解决方法

我正在使用 ControllerBuilder.SetControllerFactory以及您可以在开源项目 MvcContrib中找到的代码执行此操作:

的Global.asax.cs

  1. protected void Application_Start()
  2. {
  3. ...
  4.  
  5. IWindsorContainer windsorContainer = new WindsorContainer();
  6. windsorContainer.RegisterControllers(Assembly.GetExecutingAssembly());
  7. ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(windsorContainer));
  8.  
  9. ...
  10. }

WindsorControllerFactory

  1. public class WindsorControllerFactory : DefaultControllerFactory
  2. {
  3. private readonly IWindsorContainer _container;
  4.  
  5. public WindsorControllerFactory(IWindsorContainer container)
  6. {
  7. if (container == null)
  8. {
  9. throw new ArgumentNullException();
  10. }
  11.  
  12. _container = container;
  13. }
  14.  
  15. protected override IController GetControllerInstance(RequestContext requestContext,Type controllerType)
  16. {
  17. if (controllerType == null)
  18. {
  19. throw new HttpException();
  20. }
  21.  
  22. if (!typeof(IController).IsAssignableFrom(controllerType))
  23. {
  24. throw new ArgumentException();
  25. }
  26.  
  27. try
  28. {
  29. return (IController)_container.Resolve(controllerType);
  30. }
  31. catch (Exception ex)
  32. {
  33. throw new InvalidOperationException();
  34. }
  35. }
  36.  
  37. public override void ReleaseController(IController controller)
  38. {
  39. IDisposable disposable = controller as IDisposable;
  40.  
  41. if (disposable != null)
  42. {
  43. disposable.Dispose();
  44. }
  45.  
  46. _container.Release(controller);
  47. }
  48. }

WindsorExtensions(见MvcContrib)

  1. public static class WindsorExtensions
  2. {
  3. public static IWindsorContainer RegisterController<T>(this IWindsorContainer container) where T : IController
  4. {
  5. container.RegisterControllers(typeof(T));
  6.  
  7. return container;
  8. }
  9.  
  10. public static IWindsorContainer RegisterControllers(this IWindsorContainer container,params Type[] controllerTypes)
  11. {
  12. foreach (Type type in controllerTypes)
  13. {
  14. if (ControllerExtensions.IsController(type))
  15. {
  16. container.Register(Component.For(type).Named(type.FullName).LifeStyle.Is(LifestyleType.Transient));
  17. }
  18. }
  19.  
  20. return container;
  21. }
  22.  
  23. public static IWindsorContainer RegisterControllers(this IWindsorContainer container,params Assembly[] assemblies)
  24. {
  25. foreach (Assembly assembly in assemblies)
  26. {
  27. container.RegisterControllers(assembly.GetExportedTypes());
  28. }
  29.  
  30. return container;
  31. }
  32. }

ControllerExtensions(见MvcContrib)

  1. public static class ControllerExtensions
  2. {
  3. public static bool IsController(Type type)
  4. {
  5. return type != null
  6. && type.Name.EndsWith("Controller",StringComparison.OrdinalIgnoreCase)
  7. && !type.IsAbstract
  8. && typeof(IController).IsAssignableFrom(type);
  9. }
  10. }

猜你在找的asp.Net相关文章