Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC-设置自定义IControllerFactory无效_Asp.net Mvc - Fatal编程技术网

Asp.net mvc ASP.NET MVC-设置自定义IControllerFactory无效

Asp.net mvc ASP.NET MVC-设置自定义IControllerFactory无效,asp.net-mvc,Asp.net Mvc,我真的不明白我在这里做错了什么-由于某种原因,IControllerFactoryI寄存器没有被使用,我最终得到了一个系统。ArgumentException: 类型“Company.WebApi.Controllers.AController”没有默认值 建造师 at System.Linq.Expressions.Expression.New(Type)at System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceTyp

我真的不明白我在这里做错了什么-由于某种原因,
IControllerFactory
I寄存器没有被使用,我最终得到了一个
系统。ArgumentException

类型“Company.WebApi.Controllers.AController”没有默认值 建造师

at System.Linq.Expressions.Expression.New(Type)at System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceActivator(HttpRequestMessage 请求,类型controllerType,Func`1和activator)位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor控制器描述符,类型 控制器类型)

在Global.asax.cs中

protected void Application_Start()
{
    //DI-setup
    var container = new WindsorContainer().Install(new WebWindsorInstaller());

    //set custom controller factory
    var controllerFactory = container.Resolve<IControllerFactory>();
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);

    //register cors
    container.Resolve<ICorsConfig>().RegisterCors(GlobalConfiguration.Configuration);

    //routes
    RegisterRoutes(RouteTable.Routes);
}
我已经盯着这个看了好几个小时,真的不明白为什么它不起作用。调试
ControllerFactory时,除了构造函数外,任何方法都不会命中
。有人看到这里出了什么问题或遗漏了什么吗

(没有回答我的问题)

编辑1-控制器

    public class AController : CrudController<AModel>
    {
        public AController(IAHandler aHandler) : base(aHandler)
        {
            ...
        }

        [HttpGet]
        public HttpResponseMessage GetByUser(string aId)
        {
            ...
        }
    }

    public abstract class CrudController<T> : ApiController
        where T : IModel, new()
    {
        protected CrudController(ICrudHandler<T> handler)
        {
            ...
        }

        [HttpGet]
        public HttpResponseMessage Get(string id)
        {
            ...
        }

        [HttpPost]
        public HttpResponseMessage Post(T input)
        {
            ...
        }

        [HttpPut]
        public HttpResponseMessage Put(T input)
        {
            ...
        }
    }
    public sealed class WebWindsorInstaller : IWindsorInstaller
    {
        private bool _installComplete;

        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            if(_installComplete)
                return;

            //register self for reuse
            container.Register(Component.For<IWindsorInstaller>().Instance(this));

            //controller factory
            container.Register(
                Component.For<IControllerFactory>().ImplementedBy<ControllerFactory>().LifeStyle.Singleton);

            //Handlers
            container.Register(
                Classes.FromAssemblyContaining<AHandler>().InSameNamespaceAs<AHandler>().WithService.
                    DefaultInterfaces());

            //Models
            container.Register(
                Classes.FromAssemblyContaining<AModel>().InSameNamespaceAs<AModel>().WithService.Self());

            //DI
            container.Register(Component.For<IWindsorContainer>().Instance(container));
            container.Register(Component.For<IDependencyResolver>().ImplementedBy<WindsorDependencyResolver>());

            //Controllers
            container.Register(Classes
                .FromAssemblyContaining<AController>()
                .BasedOn<IHttpController>()
                .LifestyleScoped());

            //repositories
            container.Register(
                Classes.FromAssemblyContaining<ARepository>().InSameNamespaceAs<ARepository>().WithService.
                    DefaultInterfaces());

            //cors
            container.Register(Component.For<ICorsConfig>().ImplementedBy<CorsConfig>());

            _installComplete = true;
        }
    }
public类控制器:CrudController
{
公共控制器(IAHandler aHandler):基本控制器(aHandler)
{
...
}
[HttpGet]
公共HttpResponseMessage GetByUser(字符串辅助)
{
...
}
}
公共抽象类CrudController:ApiController
其中T:IModel,new()
{
受保护的CrudController(ICrudHandler)
{
...
}
[HttpGet]
公共HttpResponseMessage获取(字符串id)
{
...
}
[HttpPost]
公共httpresponsemessagepost(T输入)
{
...
}
[HttpPut]
公共httpresponsemessageput(T输入)
{
...
}
}
编辑2-安装程序

    public class AController : CrudController<AModel>
    {
        public AController(IAHandler aHandler) : base(aHandler)
        {
            ...
        }

        [HttpGet]
        public HttpResponseMessage GetByUser(string aId)
        {
            ...
        }
    }

    public abstract class CrudController<T> : ApiController
        where T : IModel, new()
    {
        protected CrudController(ICrudHandler<T> handler)
        {
            ...
        }

        [HttpGet]
        public HttpResponseMessage Get(string id)
        {
            ...
        }

        [HttpPost]
        public HttpResponseMessage Post(T input)
        {
            ...
        }

        [HttpPut]
        public HttpResponseMessage Put(T input)
        {
            ...
        }
    }
    public sealed class WebWindsorInstaller : IWindsorInstaller
    {
        private bool _installComplete;

        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            if(_installComplete)
                return;

            //register self for reuse
            container.Register(Component.For<IWindsorInstaller>().Instance(this));

            //controller factory
            container.Register(
                Component.For<IControllerFactory>().ImplementedBy<ControllerFactory>().LifeStyle.Singleton);

            //Handlers
            container.Register(
                Classes.FromAssemblyContaining<AHandler>().InSameNamespaceAs<AHandler>().WithService.
                    DefaultInterfaces());

            //Models
            container.Register(
                Classes.FromAssemblyContaining<AModel>().InSameNamespaceAs<AModel>().WithService.Self());

            //DI
            container.Register(Component.For<IWindsorContainer>().Instance(container));
            container.Register(Component.For<IDependencyResolver>().ImplementedBy<WindsorDependencyResolver>());

            //Controllers
            container.Register(Classes
                .FromAssemblyContaining<AController>()
                .BasedOn<IHttpController>()
                .LifestyleScoped());

            //repositories
            container.Register(
                Classes.FromAssemblyContaining<ARepository>().InSameNamespaceAs<ARepository>().WithService.
                    DefaultInterfaces());

            //cors
            container.Register(Component.For<ICorsConfig>().ImplementedBy<CorsConfig>());

            _installComplete = true;
        }
    }
公共密封类WebWindsorInstaller:IWindsorInstaller
{
私人住宅安装完成;
public void安装(IWindsorContainer、IConfigurationStore)
{
如果(_installComplete)
返回;
//注册自己以便重用
Register(Component.For().Instance(this));
//控制器厂
集装箱。登记(
Component.For().ImplementedBy().LifeStyle.Singleton);
//处理者
集装箱。登记(
类。FromAssemblyContaining().InSameNamespaceAs().WithService。
DefaultInterfaces());
//模型
集装箱。登记(
类。FromAssemblyContaining().InSameNamespaceAs().WithService.Self());
//DI
Register(Component.For().Instance(container));
container.Register(Component.For().ImplementedBy());
//控制器
容器.寄存器(类)
.FromAssemblyContaining()
.BasedOn()
.lifestylescope());
//存储库
集装箱。登记(
类。FromAssemblyContaining().InSameNamespaceAs().WithService。
DefaultInterfaces());
//科尔斯
container.Register(Component.For().ImplementedBy());
_installComplete=true;
}
}

从您问题中的错误消息来看,您似乎确实想要注册WebAPI控制器。需要注意的是,这些控制器与MVC控制器不同,并且不使用相同的控制器工厂(您正在尝试使用)


有关如何为Web API控制器执行此操作的详细信息,请参阅Mark Seeman的帖子。

从您问题中的错误消息来看,您似乎确实想要注册Web API控制器。需要注意的是,这些控制器与MVC控制器不同,并且不使用相同的控制器工厂(您正在尝试使用)


有关如何为Web API控制器执行此操作的详细信息,请参阅Mark Seeman的帖子。

您在哪里注册
ControllerFactory
使用容器键入?我刚刚查看了您在问题中提供的链接。在链接中,自定义控制器工厂设置在这一行
ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory))。您正在尝试使用容器解析
IControllerFactory
实例,但尚未首先向容器注册任何内容(除非您遗漏了一些详细信息)Hi-Suhas,感谢您进行了中断测试。所有内容都在行
var container=new WindsorContainer()中注册。安装(new WebWindsorInstaller())
正如我所提到的,调试时命中了
ControllerFactory
的构造函数,证明解析正确执行。您可以显示引发此异常的控制器类吗?您将IControllerFactory映射到其相应的impl(ControllerFactory)的位置?我现在不知道温莎,它会自动解决吗?你在哪里注册
ControllerFactory
容器类型?我只是看了你在问题中给出的链接。在链接中,自定义控制器工厂设置在这一行
ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory))。您正在尝试使用容器解析
IControllerFactory
实例,但尚未首先向容器注册任何内容(除非您遗漏了一些详细信息)Hi-Suhas,感谢您进行了中断测试。所有内容都在行
var container=new WindsorContainer()中注册。安装(new WebWindsorInstaller())
正如我提到的,调试时命中了
ControllerFactory
的构造函数,证明解析正确执行。您能显示引发此异常的控制器类吗?您在哪里映射IControllerFa