为什么温莎城堡试图解决我的“内容”和“脚本”文件夹作为控制器?(Why is Castle Wind

2019-08-22 15:39发布

我已经创建了一个ASP.NET MVC应用程序,我试图使用温莎城堡作为我的IOC

然而,当控制器试图解决我得到“内容”和“脚本”为在该“controllerName”参数CreateController(RequestContext requestContext, string controllerName)方法。 不用说这些都不是控制器。 他们似乎是网站的文件夹

为什么试图注册这些作为控制器?

我怎么忽略这些文件夹?

谢谢

从WindsorControllerFactory例外

由于不能够张贴的图片我已经来形容它 - 它基本上只是说:

“该contentcontroller未找到”

的Global.asax.cs

public static IIocContainer Ioc;

            protected void Application_Start()
            {
                InitialiseIocContainer();
                RegisterViewEngine(ViewEngines.Engines);
                RegisterRoutes(RouteTable.Routes);
                StartProfiling();
            }


private void InitialiseIocContainer()
        {
            IWindsorContainer _container = new WindsorContainer();

            var controllerTypes = typeof (GidgetController).Assembly.GetTypes();
            foreach (var controllerType in controllerTypes.Where((t=>typeof(IController).IsAssignableFrom(t))))
            {
                _container.AddComponentLifeStyle(controllerType.Name.ToLower(), controllerType, LifestyleType.Transient);   
            }


            _container.AddComponent("a",typeof(IGidgetService), typeof(GidgetService));
            _container.AddComponent("b",typeof(IGidgetRepository), typeof(GidgetRepository));
            _container.AddComponent("c",typeof(IGidgetValidator), typeof(GidgetValidator));


            ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(_container));

        }

windsorControllerFactory.cs

public IController CreateController(RequestContext requestContext, string controllerName)
        {
            try
            {
                controllerName = controllerName.ToLower() + "controller";
                var controller = _container.Resolve<IController>(controllerName);
                return controller;
            }
            catch (ComponentNotFoundException)
            {
                throw new HttpException(404, string.Format("The {0} controller was not found", controllerName));

            }

        }

Answer 1:

只需使用MVCContrib 。

它包括一切整合温莎和ASP.NET MVC,包括控制器工厂 ,并扩展到注册控制器 。



Answer 2:

我跟史蒂夫桑德森在创造WindsorControllerFactory,它工作得很好的模式。 我已经修改了他的实际返回正确的404时,有没有名字(即有人类型“/ garbageblahblah”)控制器,因为他的模式并没有把它捡起来。 所以,我使用反射来抓住内置到默认的控制器工厂,用于处理不良网址的位。

他的模式使用反射来找到你的MVC项目中的所有控制器,并在应用程序启动时注册它们。 你不希望使用CreateController,而是GetControllerInstance(),因为这将控制器将被调用仅由底层MVC框架调用。 /内容按照惯例忽略,因此不叫。

我CastleWindsorControllerFactory:

/// <summary>
/// Represents a special controller factory.
/// </summary>
public class CastleWindsorControllerFactory : DefaultControllerFactory
{
    WindsorContainer _container;

    public CastleWindsorControllerFactory()
    {
        // register all controllers from the calling assembly.
        // (e.g. the mvc site calling this factory)
        //
        _container =
            new WindsorContainer(
                new XmlInterpreter(
                    new ConfigResource("castle")
                )
            );

        // change this to Assembly.GetAssembly() if used directly from
        // your MVC website.  The code below is for when this class
        // exists in a seperate assembly.
        //
        var controllers =
            from t in Assembly.GetCallingAssembly().GetTypes()
            where typeof(IController).IsAssignableFrom(t)
            select t;

        foreach (Type t in controllers)
            _container.AddComponentLifeStyle(
                t.FullName, t, LifestyleType.Transient); 
    }

    protected override IController GetControllerInstance(Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException(
                0x194
                , string.Format(
                    CultureInfo.CurrentUICulture
                    , "Controller Not Found"
                    , new object[] {
                        this.RequestContext.HttpContext.Request.Path }));
        }
        if (false == typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException(
                string.Format(
                    CultureInfo.CurrentUICulture
                    , "Type does not sub-class the controller base"
                    , new object[] { controllerType }), "controllerType");
        }

        return 
            (IController) _container.Resolve(controllerType);
    }
}

而我Globals.asax.cs内,这是你所需要的(你有什么上面是巨大的矫枉过正!我已通过环和我上面的CastleWindsorControllerFactor内进行注册)。

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);

    // custom controller factory that uses Windsor
    ControllerBuilder.Current.SetControllerFactory(
        new CastleWindsorControllerFactory());

    // Uncomment to debug routes
    //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}

从技术上讲,这不正是我使用的代码。 其实我已经在一类我称之为ComponentFactory抽象整个温莎城堡开了一个静态实例。 这让我通过我的应用程序有真正的Singleton模式,其中包括一些强力式增加。

我提到这一点,因为我打算释放ComponentFactory()很快在我的博客。 但是,请给我一个电子邮件,我会送最新版本给你。 电子邮件是:我-at- eduncan911.com



文章来源: Why is Castle Windsor trying to resolve my 'Content' and 'Scripts' folder as a controller?