首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >城堡温莎3.0和ASP.NET MVC控制器

城堡温莎3.0和ASP.NET MVC控制器
EN

Stack Overflow用户
提问于 2011-09-12 11:18:39
回答 2查看 3.2K关注 0票数 4

我正在使用Castle 3.0,它对我非常有效,直到我尝试注册控制器(我使用了WCF工具和存储库/服务层的IoC )。以下是我的控制器安装程序类:

代码语言:javascript
复制
public class ControllersInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        RegisterAllBasedOnWithCustomComponentRegistration(container, typeof(IController),
            typeof(HomeController).Assembly,
            cr => cr.LifeStyle.Transient);

    }

    private void RegisterAllBasedOnWithCustomComponentRegistration(IWindsorContainer container, Type baseType,
    Assembly assemblyWithImplementations, Func<ComponentRegistration, ComponentRegistration<object>> customComponentRegistrationCb)
    {
        container.Register(
            AllTypes.FromAssembly(assemblyWithImplementations)
                .BasedOn(baseType)
                .If(t => t.Name.EndsWith("Controller"))
                .Configure(c => customComponentRegistrationCb(c)));
    }
}

这是我的控制器工厂:

代码语言:javascript
复制
public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        var controllerComponentName = controllerName + "Controller";
        return _kernel.Resolve<IController>(controllerComponentName);
    }
}

在我的global.asax中,我调用了下一个方法:

InversionOfControl.InstallControllers(FromAssembly.This());

在另一个项目中。在这里,我调用了安装代码:

代码语言:javascript
复制
    public static void InstallControllers(IWindsorInstaller install)
    {
        _container.Install(install);
    }

这似乎是我做错了什么,我希望我是因为这可能是一个“永远不要再使用awny测试版”的时刻对我。

我得到了下一个异常:没有支持服务System.Web.Mvc.IController的组件,也找到了,我可以看到控制器在调试模式下在容器中注册

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-12 14:02:38

在本例中,添加.WithServices(typeof(IController))并命名所有组件。

代码语言:javascript
复制
cr => cr.LifeStyle.Transient.Named(cr.Implementation.Name)

你的注册应该是:

代码语言:javascript
复制
.Register(
AllTypes.FromAssembly(assemblyWithImplementations)
        .BasedOn(baseType)
        .WithServices(typeof(IController))
        .If(t => t.Name.EndsWith("Controller"))...)
票数 1
EN

Stack Overflow用户

发布于 2011-09-12 13:05:18

在ControllerFactory中,不应该解析IController,而应该解析具体的控制器类型。下面是我经常使用的一个典型的基于温莎的ControllerFactory:

代码语言:javascript
复制
public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IWindsorContainer _container;

    public WindsorControllerFactory(IWindsorContainer container)
    {
        _container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        return (IController)_container.Resolve(controllerType);
    }

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7387035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档