Autofac:使用Web API 2进行设置

尖刺

我正在一个隔离的C#解决方案中测试Autofac,我想将测试管理器注入到家庭控制器中,其设置如下:

一个非常简单的界面

public interface ITestManager
{
    IEnumerable<string> Get();
}

实施者

public class TestManager : ITestManager
{
    public IEnumerable<string> Get()
    {
        return new List<string>
        {
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, ",
            "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ",
            "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut ",
            "aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in ",
            "voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint ",
            "occaecat cupidatat non proident, sunt in culpa qui officia ",
            "deserunt mollit anim id est laborum."
        };
    }
}

这将由TestController接收

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

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

这样就建立了依赖关系

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();
    }
}

这是从global.asax内部链接的

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    IoC.Autofac.Register(GlobalConfiguration.Configuration);
}

运行此命令将导致以下错误:

“ /”应用程序中的服务器错误。

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

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。

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

我想念什么?

全栈跟踪:

堆栈跟踪

[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();
    }
}

我曾经builder.RegisterApiControllers(Assembly.GetExecutingAssembly())用来注册控制器,但这仅适用于API控制器,并且由于我的TestController是类型Controller(这是核心MVC控制器类型),因此未正确连接。

如果您还希望使用(普通的)MVC,则应使用以下代码:

builder.RegisterControllers(Assembly.GetExecutingAssembly())

为向正确的方向指点我致以敬意

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在带有混合MVC的AppBuilder.Map块中使用Owin Web API进行Autofac设置

来自分类Dev

无法使Autofac与Web API 2一起使用

来自分类Dev

如何设置ASP.Net 3.0 Core Web API项目以使用AutoFac和NLog?

来自分类Dev

Autofac Web API 2和Owin在StartupConfig中解析

来自分类Dev

无法将 autofac 与 web api 2 和 mvc 集成

来自分类Dev

使用Web API的Autofac:从HttpRequestMessage注入依赖项吗?

来自分类Dev

与Web Api的Autofac集成错误

来自分类Dev

依赖项注入不适用于Owin自托管Web Api 2和Autofac

来自分类Dev

如何在混合的Web API和MVC应用程序中使用Autofac解析Web API控制器?

来自分类Dev

使用Microsoft CDS Web API设置PrivilegeDepth

来自分类Dev

如何使用Web API设置jwplayer?

来自分类Dev

使用Web Api服务进行多次通话

来自分类Dev

使用Web API SelfHost进行Specflow测试

来自分类Dev

如何在 Web API 中使用 AutoFac 在运行时解析服务?

来自分类Dev

使用Http / 2从javascript进行api调用

来自分类Dev

ASP Web API和Autofac集成异常

来自分类Dev

ASP Web API and Autofac Integration Exception

来自分类Dev

如何在Web API 2中使用DotnetOpenAuth设置Web API以允许URL中的Acces令牌作为参数

来自分类Dev

如何将Autofac和Log4Net与ASP.NET Web API 2应用程序集成

来自分类Dev

ASP.NET Web Api 2-使用枚举进行模型绑定

来自分类Dev

使用媒体类型对ASP.NET Web API 2进行版本控制

来自分类Dev

使用ASP.NET Web API 2进行身份验证

来自分类Dev

使用 ASP.NET Web API 2 进行外部身份验证 - Microsoft 现在不工作

来自分类Dev

使用 ASP.net core 2 Web API 和 SPA 进行隐式授权

来自分类Dev

使用Autofac进行属性注入

来自分类Dev

在api文件夹中使用旧版asmx服务进行Web Api 2路由配置

来自分类Dev

在api文件夹中使用旧版asmx服务进行Web Api 2路由配置

来自分类Dev

如何正确配置模拟依赖项以使用 Autofac 测试 Web Api (ASP.NET Core) 控制器

来自分类Dev

Web API-使用HttpRequestMessage ID设置每个线程吗?

Related 相关文章

  1. 1

    在带有混合MVC的AppBuilder.Map块中使用Owin Web API进行Autofac设置

  2. 2

    无法使Autofac与Web API 2一起使用

  3. 3

    如何设置ASP.Net 3.0 Core Web API项目以使用AutoFac和NLog?

  4. 4

    Autofac Web API 2和Owin在StartupConfig中解析

  5. 5

    无法将 autofac 与 web api 2 和 mvc 集成

  6. 6

    使用Web API的Autofac:从HttpRequestMessage注入依赖项吗?

  7. 7

    与Web Api的Autofac集成错误

  8. 8

    依赖项注入不适用于Owin自托管Web Api 2和Autofac

  9. 9

    如何在混合的Web API和MVC应用程序中使用Autofac解析Web API控制器?

  10. 10

    使用Microsoft CDS Web API设置PrivilegeDepth

  11. 11

    如何使用Web API设置jwplayer?

  12. 12

    使用Web Api服务进行多次通话

  13. 13

    使用Web API SelfHost进行Specflow测试

  14. 14

    如何在 Web API 中使用 AutoFac 在运行时解析服务?

  15. 15

    使用Http / 2从javascript进行api调用

  16. 16

    ASP Web API和Autofac集成异常

  17. 17

    ASP Web API and Autofac Integration Exception

  18. 18

    如何在Web API 2中使用DotnetOpenAuth设置Web API以允许URL中的Acces令牌作为参数

  19. 19

    如何将Autofac和Log4Net与ASP.NET Web API 2应用程序集成

  20. 20

    ASP.NET Web Api 2-使用枚举进行模型绑定

  21. 21

    使用媒体类型对ASP.NET Web API 2进行版本控制

  22. 22

    使用ASP.NET Web API 2进行身份验证

  23. 23

    使用 ASP.NET Web API 2 进行外部身份验证 - Microsoft 现在不工作

  24. 24

    使用 ASP.net core 2 Web API 和 SPA 进行隐式授权

  25. 25

    使用Autofac进行属性注入

  26. 26

    在api文件夹中使用旧版asmx服务进行Web Api 2路由配置

  27. 27

    在api文件夹中使用旧版asmx服务进行Web Api 2路由配置

  28. 28

    如何正确配置模拟依赖项以使用 Autofac 测试 Web Api (ASP.NET Core) 控制器

  29. 29

    Web API-使用HttpRequestMessage ID设置每个线程吗?

热门标签

归档