MVC - 创建城堡温莎控制器工厂 - 没有为此对象定义的无参数构造函数

时间:2010-12-01 22:15:44

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

我正在将DI引入我的MS MVC应用程序中,并且我无法从我的自定义Controller Factory中实例化控制器。似乎没有调用被覆盖的“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());
    }

控制器工厂已实例化,但似乎它不用于解析Controller。我在'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);
    }  

2 个答案:

答案 0 :(得分:1)

请参阅creating WindsorContainer results in type conversion error(不是完全相同的问题,但仍然是相同的答案)

答案 1 :(得分:0)

你可能遇到的另一个问题是这个电话:

AppDomain.CurrentDomain.GetAssemblies()
如果程序集实际上没有加载到AppDomain中,

...将不会检索所有可用的控制器。 AppDomain在需要时加载程序集,因此如果您没有在代码中明确调用它们,则不会加载它们。

相关问题