【问题标题】:MVC - Creating a Castle Windsor Controller Factory - No parameterless constructor defined for this objectMVC - 创建 Castle Windsor 控制器工厂 - 没有为此对象定义无参数构造函数
【发布时间】:2010-12-01 22:15:44
【问题描述】:

我正在将 DI 引入我的 MS MVC 应用程序,但我无法从我的自定义控制器工厂中实例化控制器。似乎没有调用覆盖的“GetControllerInstance”。

谁能告诉我我错过了什么?

我的控制器工厂:

public class WindsorControllerFactory : DefaultControllerFactory
{
    public WindsorControllerFactory()
    {
        var controllerTypes = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
                              where typeof (IController).IsAssignableFrom(t)
                              select t;
        foreach (Type controllerType in controllerTypes)
        {
            ApplicationContainer.Container.AddComponentLifeStyle(controllerType.FullName, controllerType,
                                                                 LifestyleType.Transient);
        }
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if(controllerType !=null)
        {
            return (IController) ApplicationContainer.Container.Resolve(controllerType);
        }
        return base.GetControllerInstance(requestContext, controllerType);
    }
}

}

Application_Start:

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

控制器工厂已实例化,但它似乎不用于解析控制器。我在“GetControllerInstance”上放置了一个断点,但它从未被命中。

结果是没有为此对象定义无参数构造函数。抛出异常

更新:

我将 GetControllerInstance 更改为:

 private WindsorContainer _container;

    public WindsorControllerFactory(WindsorContainer container)
    {
        _container = container;
        _container.Register(AllTypes.Of<IController>().FromAssembly(
      typeof(BaseFactoryController).Assembly).Configure(
          c => c.Named(c.Implementation.Name.ToLowerInvariant()).LifeStyle.Transient));
    }

现在我必须忽略 null controllerType ?!如果没有评论:

//base.GetControllerInstance(requestContext, controllerType);

它开始将我的 .js 文件视为控制器。抛出httpException

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return null;
        }
        //base.GetControllerInstance(requestContext, controllerType);
        return (IController) _container.Resolve(controllerType);
    }  

【问题讨论】:

标签: asp.net-mvc castle-windsor ioc-container


【解决方案1】:

creating WindsorContainer results in type conversion error(不是同一个问题,但答案是一样的)

【讨论】:

  • 如果可能的话,我宁愿不引入另一个库。我更想知道为什么这个实现不起作用。
  • @Nick:您可以使用 MVCContrib 的实现作为参考与您的进行比较。
  • @Maurcio:你赢了 :) 我在看 MVCContib。 MVCContrib.Castle 命名空间在哪里?它似乎不在 MVCContrib.dll 中
  • @Maurcio:它在附加版本中得到了它。
【解决方案2】:

您可能遇到的另一个问题是这个调用:

AppDomain.CurrentDomain.GetAssemblies()

...如果程序集尚未实际加载到 AppDomain 中,则不会检索所有可用的控制器。 AppDomain 会在需要时加载程序集,因此如果您没有在代码中显式调用它们,它们将不会被加载。

【讨论】:

  • 我正在用新的实现来更新我的帖子。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 2010-11-24
  • 2013-04-25
相关资源
最近更新 更多