C# Autofac:使用Web API 2进行设置,我缺少什么
我正在一个孤立的C#解决方案中测试Autofac,我想在家庭控制器中插入一个测试管理器,它的设置如下: 非常简单的界面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
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();
}
}