2

我正在尝试将 Autofac 用于带有 WebApi2 和 OWIN 的 Asp.Net MVCApplication 的 DI 容器。我的 global.asax.cs 在Application_Start(). 我的 startup.cs 具有以下配置:

public void Configuration(IAppBuilder app)
{
    DependencyInjectionConfig.Configure(app);

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

并且 DependencyInjectionConfig.Configure 是:

public static void Configure(IAppBuilder app)
{
    var config = new HttpConfiguration(); //this means webapi controllers don't use DI container
    //var config = GlobalConfiguration.Configuration; //this makes MVC view controllers fail to do anything


    var builder = new ContainerBuilder();
    var assm = Assembly.GetExecutingAssembly();

    //MVC and WebAPI Controllers
    builder.RegisterControllers(assm);
    builder.RegisterApiControllers(assm);
    WebApiConfig.Register(config);

    //Model Binders
    builder.RegisterModelBinders(assm);
    builder.RegisterModelBinderProvider();

    //Modules
    builder.RegisterModule<AutofacWebTypesModule>();

    //MVC Views
    builder.RegisterSource(new ViewRegistrationSource());

    //MVC and WebAPI Filters

    builder.RegisterFilterProvider();
    builder.RegisterWebApiFilterProvider(config);

    //Finally, Any custom registrations
    RegisterComponents(builder, assm);
    /* My items show in the builder as expected at this point */

    //build the container
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    //Special OWIN bits
    app.UseAutofacMiddleware(container);
    app.UseAutofacMvc();
    app.UseAutofacWebApi(config);
    app.UseWebApi(config);
}

我的问题是 Autofac 似乎没有做任何参数解析,无论我是否使用var config = new HttpConfiguration();var config = GlobalConfiguration.Configuration;. 奖金,如果我将GlobalConfiguration.ConfigurationMVC 控制器用于视图完全失败。

ApiController 非常简单:

public class MessagesController : ApiController
{
     private IMesageHandler MessageHandler {get; set;}
     public MessagesController(IMessageHandler messageHandler)
     {
         this.MessageHandler = messageHandler;
     }
     [HttpGet]
     public string Get()
     {
         return "Hello World";
     }
}

例外是它找不到无参数构造函数(因为 Autofac 容器似乎在打盹)。

4

0 回答 0