Castle Windsor - Injecting IActionInvoker Implementation Issue

前端 未结 1 989
独厮守ぢ
独厮守ぢ 2020-12-16 07:41

I am trying to use the approach from this article, but I am missing something - I am currently getting an error within WindsorControllerFactory.GetControllerInstance when it

相关标签:
1条回答
  • 2020-12-16 08:03

    Global.asax

    private static void bootstrapContainer()
    {
        container = new WindsorContainer()
            .Install(FromAssembly.This());
        var controllerFactory = new WindsorControllerFactory(container.Kernel);
    
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    }
    

    Installer / filling container

    public class ControllersInstaller : IWindsorInstaller
    {
        #region IWindsorInstaller Members
    
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Component.For<WpRegistration.Web.Filters.AgencyAuthorize>().LifeStyle.Transient);
            container.Register(Component.For<IActionInvoker>().ImplementedBy<WindsorExtensions.Mvc.WindsorActionInvoker>().LifeStyle.Transient);
    
            container.Register(AllTypes.FromThisAssembly()
                                .BasedOn<IController>()
                                .If(Component.IsInSameNamespaceAs<HomeController>())
                                .If(t => t.Name.EndsWith("Controller"))
                                .Configure((c => c.LifeStyle.Transient)));
        }
    
        #endregion
    }
    

    WindsorControllerFactory

    using System;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    using Castle.MicroKernel;
    
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        private readonly IKernel kernel;
    
        public WindsorControllerFactory(IKernel kernel)
        {
            this.kernel = kernel;
        }
    
        public override void ReleaseController(IController controller)
        {
            kernel.ReleaseComponent(controller);
        }
    
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
            }
    
        IController iController = (IController)kernel.Resolve(controllerType);
    
        // new code    
        if (iController is Controller)    
        {
            ((Controller)iController).ActionInvoker = kernel.Resolve<IActionInvoker>();
        }
    
        return iController;
        }
    }
    

    WindsorActionInvoker

    namespace WindsorExtensions.Mvc
    {
    
        public class WindsorActionInvoker : ControllerActionInvoker
        {
            readonly IKernel kernel;
            public WindsorActionInvoker(IKernel kernel) 
            { 
                this.kernel = kernel; 
            }
            protected override ActionExecutedContext InvokeActionMethodWithFilters(
                ControllerContext controllerContext
                , IList<IActionFilter> filters
                , ActionDescriptor actionDescriptor
                , IDictionary<string, object> parameters)
            {
                foreach (IActionFilter actionFilter in filters)
                {
                    kernel.InjectProperties(actionFilter);
                }
                return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
            }
        }
    
        public static class WindsorExtension 
        { 
            public static void InjectProperties(this IKernel kernel, object target) 
            { 
                var type = target.GetType(); 
                foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
                { 
                    if (property.CanWrite && kernel.HasComponent(property.PropertyType)) 
                    { 
                        var value = kernel.Resolve(property.PropertyType); 
                        try { property.SetValue(target, value, null); } 
                        catch (Exception ex) 
                        { 
                            var message = string.Format("Error setting property {0} on type {1}, See inner exception for more information.", property.Name, type.FullName);
                            throw new ComponentActivatorException(message, ex); 
                        }
                    }
                }
            }
        }
    }
    

    AgencyAuthorizeAttribute

    namespace WpRegistration.Web.Filters 
    {
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
        public sealed class AgencyAuthorize : ActionFilterAttribute
        {
            CurrentUserService _currentUserSvc;
            public AgencyAuthorize() { }
    
            public CurrentUserService Service
            {
                get { return _currentUserSvc; }
                set
                {
                    this._currentUserSvc=value;
                }
            }
    
    0 讨论(0)
提交回复
热议问题