Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
C# Can';t解析Web Api控制器中的依赖项_C#_Asp.net_Castle Windsor_Asp.net Web Api_Owin - Fatal编程技术网

C# Can';t解析Web Api控制器中的依赖项

C# Can';t解析Web Api控制器中的依赖项,c#,asp.net,castle-windsor,asp.net-web-api,owin,C#,Asp.net,Castle Windsor,Asp.net Web Api,Owin,我有一个带有owin和Windsor的Web Api 获取下一个错误: 发生错误。尝试创建“DBManagerController”类型的控制器时出错。确保控制器在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)处具有无参数公共构造函数.Sys

我有一个带有owin和Windsor的Web Api

获取下一个错误:

发生错误。尝试创建“DBManagerController”类型的控制器时出错。确保控制器在System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)处具有无参数公共构造函数.System.InvalidOperationException 在System.Web.Http.Controllers.HttpControllerDescriptor.CreateController上(HttpRequestMessage请求) 在System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()处发生错误。键入“Swissphone.SolutionKit.Utilities.DbInit.DataManager.WebHost.Controllers.DBManagerController”在System.Linq.Expressions.Expression.New(Type)处没有默认构造函数System.ArgumentException 在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 controllerDescriptor,类型controllerType)

这很奇怪,因为我注册了所有依赖项

这是我的创业课程:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var httpContext = HttpContext.Current;
        var hibernateConfigFileName = string.Empty;
        if (httpContext != null)
        {
            hibernateConfigFileName = httpContext.Server.MapPath(Properties.Settings.Default.HibernateConfigFile);
        }
        else
        {
            throw new InvalidOperationException("When using IIS hosting, HttpContext.Current must not be NULL");
        }
                    var windsorContainer = new WindsorContainer();

        windsorContainer.Install(new ContextInstaller(), new DbInitInstaller());

        var configuration = new HttpConfiguration() { DependencyResolver = new WindsorResolver(windsorContainer) };


        configuration.Routes.MapHttpRoute("DBManager",
            "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });


        app.UseWebApi(configuration);
    }
}
安装者:

public class ContextInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<IUserContext>().ImplementedBy<UserContext>(),
            Component.For<ITenantContext>().ImplementedBy<TenantContext>());

    }
}


public class DbInitInstaller : IDbInitInstaller
{

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<IDbInitManager>().ImplementedBy<DbInitManager>());
    }
}
我在向控制器发出get请求时出错。无法解析IDbInitManager


有人知道这是错误的,为什么注册的依赖项没有得到解决吗?

没有,您没有注册所有的依赖项

基本上,发生的情况是您没有在容器中显式注册控制器。Windsor尝试为您解析未注册的具体类型,但由于无法解析(由您的配置中的错误引起),因此返回null。由于IDependencyResolver契约,Web API强制它返回null。由于Windsor返回null,Web API将尝试创建控制器本身,但由于它没有默认构造函数,因此将抛出“确保控制器具有无参数公共构造函数”异常。此异常消息具有误导性,不能解释真正的原因

您可以为控制器添加其他安装程序:

public class ControllersInstallers : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                            .BasedOn<IHttpController>()
                            .LifestylePerWebRequest());
    }
}
公共类控制器安装程序:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
container.Register(Classes.fromthissembly())
.BasedOn()
.LifestylePerWebRequest());
}
}
必须从Windsor解析的每个依赖项都必须明确注册

public class DbInitManager : IDbInitManager
{
    public DbInitManager()
    {}
}
public class ControllersInstallers : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromThisAssembly()
                            .BasedOn<IHttpController>()
                            .LifestylePerWebRequest());
    }
}