2016-03-03 58 views
0

我有一个简单的AutoFac示例工作,但现在想要将其应用于我的web api项目并在图层之间有正确的分隔。AutoFac MVC Web API

我看到的问题是标准的控制器x“不具有默认构造函数”,但我难倒以便在征求意见..

我打电话RegisterApiControllers以及RegisterControllers ..

这就是我在我的DependencyInjectionContainer

public static class DependencyInjectionContainer 
{ 
    public static ContainerBuilder Builder; 
    public static IContainer Container; 

    public static void Init(Assembly mainAssembly) 
    { 
     Builder = new ContainerBuilder(); 
     var config = GlobalConfiguration.Configuration; 

     RegisterTypes(mainAssembly); 

     Container = Builder.Build(); 

     config.DependencyResolver = new AutofacWebApiDependencyResolver(Container); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(Container)); 
    } 

    private static void RegisterTypes(Assembly mainAssembly) 
    { 
     var roomBookingConnectionString = ConfigurationManager.ConnectionStrings["RoomBooking"].ConnectionString; 

     Builder.RegisterControllers(mainAssembly); 

     Builder.RegisterType<RoomRepository>().As<IRoomRepository>().WithParameter(new TypedParameter(typeof(string), roomBookingConnectionString)); 
     Builder.RegisterType<RoomService>().As<IRoomService>(); 

     Builder.RegisterApiControllers(mainAssembly); 

     Builder.RegisterFilterProvider(); 
    } 
} 

我在我的Global.asax.cs

调用此3210

这里的一个大的假设是,这是正确的...

Builder.RegisterApiControllers(mainAssembly); 

编辑-------------------------- -------------------------------------------

我刚才尝试将上述两种方法中的所有DI注册等都移回到global.asax.cs中,并且它可以工作!?!?

我认为它与'RegisterApiControllers'有关。我使用'typeof(MvcApplication).Assembly'将调用程序集传递给上述init方法。这有什么问题吗?

谢谢。

+0

我想我有这个工作。我不确定,但我认为这是因为我有一个名为“DependencyInjection”的类,它与某些其他方面有冲突吗? –

回答

0

Autofac使用RegisterApiControllers方法来定位控制器。

当你这样做Builder.RegisterApiControllers(mainAssembly);你确定mainAssembly参数是包含控制器的程序集吗?

无论如何,如果你有这样那样的问题,你可以做这样的事情(猜测你有一个名为RoomBookingController控制器):

builder.RegisterApiControllers(typeof(RoomBookingController).Assembly); 

这样Autofac将找到包含你的控制器总成,不管它在哪里。