C# Autofac:使用Web API 2进行设置,我缺少什么

C# Autofac:使用Web API 2进行设置,我缺少什么,c#,.net,asp.net-mvc,asp.net-web-api2,autofac,C#,.net,Asp.net Mvc,Asp.net Web Api2,Autofac,我正在一个孤立的C#解决方案中测试Autofac,我想在家庭控制器中插入一个测试管理器,它的设置如下: 非常简单的界面 public interface ITestManager { IEnumerable<string> Get(); } [MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInst

我正在一个孤立的C#解决方案中测试Autofac,我想在家庭控制器中插入一个测试管理器,它的设置如下:

非常简单的界面

public interface ITestManager
{
    IEnumerable<string> Get();
}
[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +119
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
   System.Activator.CreateInstance(Type type) +11
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: An error occurred when trying to create a controller of type 'AutofacWebApi.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +178
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +76
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +88
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +191
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
并且依赖项是这样设置的

public static class Autofac
{
    public static void Register(HttpConfiguration config)
    {
        // Base set-up
        var builder = new ContainerBuilder();

        // Register your Web API controllers.
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        // OPTIONAL: Register the Autofac filter provider.
        builder.RegisterWebApiFilterProvider(config);

        // Register dependencies

        SetUpRegistration(builder);

        // Build registration.
        var container = builder.Build();

        // Set the dependency resolver to be Autofac.
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    }

    private static void SetUpRegistration(ContainerBuilder builder)
    {
        builder.RegisterType<TestManager>()
            .As<ITestManager>()
            .InstancePerLifetimeScope();
    }
}
运行此操作将导致以下错误:

“/”应用程序中出现服务器错误

没有为此对象定义无参数构造函数

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

异常详细信息:System.MissingMethodException:无参数 为此对象定义的构造函数

我错过了什么

完整堆栈跟踪:

堆栈跟踪

public interface ITestManager
{
    IEnumerable<string> Get();
}
[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +119
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
   System.Activator.CreateInstance(Type type) +11
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: An error occurred when trying to create a controller of type 'AutofacWebApi.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +178
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +76
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +88
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +191
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +103
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

很简单,我从HomeController复制了控制器类信息,它的类型是
controller
,而不是
ApiController

因此,正确的实施方式是:

public class TestController : ApiController
{
    private ITestManager TestManager { get; set; }

    public TestController(ITestManager testManager)
    {
        TestManager = testManager;
    }

    // GET: api/Test
    public IEnumerable<string> Get()
    {
        return this.TestManager.Get();
    }
}
公共类TestController:ApiController
{
专用ITestManager测试管理器{get;set;}
公共测试控制器(ITestManager testManager)
{
TestManager=TestManager;
}
//获取:api/测试
公共IEnumerable Get()
{
返回这个.TestManager.Get();
}
}
我使用了
builder.RegisterApiControllers(Assembly.getExecutionGassembly())
来注册控制器,但这只适用于API控制器,而且,由于我的TestController是
Controller
类型(这是核心MVC控制器类型),因此没有正确连接

如果您也希望使用(普通的旧版)MVC,您应该使用:

builder.RegisterController(Assembly.getExecutionGassembly())


感谢您为我指出了正确的方向。

请告诉我完整的堆栈跟踪是什么?我已将其添加到我的问题中。该堆栈不是源自autofac,因此它在此处没有正确“连接”。ru使用owin?在哪里定义和注册了
HomeController
?因为它是堆栈跟踪中的类,所以我们也需要查看它。在我看来,您似乎正在注册api控制器,但
TestController
不是一个。您是否尝试过使用
builder.RegisterController(Assembly.getExecutionGassembly())
。您是否有对
Autofac.Integrations.Mvc
Autofac.Integrations.WebApi
的dll引用?
public class TestController : ApiController
{
    private ITestManager TestManager { get; set; }

    public TestController(ITestManager testManager)
    {
        TestManager = testManager;
    }

    // GET: api/Test
    public IEnumerable<string> Get()
    {
        return this.TestManager.Get();
    }
}