2014-12-30 2 views
3

У меня есть проект webforms, но я использую WebAPI для веб-сервисов. Я пытаюсь реализовать Autofac. Я получаю:Autofac и WebAPI - ошибка конструктора по умолчанию

'MyController' does not have a default constructor 

Согласно документации Autofac, у меня есть правильная конфигурация, но, очевидно, есть проблема. Я использую Visual Studio 2010/.Net 4. Вот мой Application_Start

private void Application_Start(object sender, EventArgs e) 
{ 
    //This enables api controllers in a separate class library 
    GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssembliesResolver()); 

    GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

    //Elmah for webapi 
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandleErrorApiAttribute()); 

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
    json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
    GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

    var builder = new ContainerBuilder(); 

    //Register DbContext 
    builder.RegisterType<MyDbContext>() 
     .As<IMyDbContext>() 
     .InstancePerRequest();  

    //Register service layer 
    var businessLayer = Assembly.GetExecutingAssembly(); 
    builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) 
     .Where(t => t.Name.EndsWith("Service")) 
     .AsImplementedInterfaces(); 

    builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
    builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

    var container = builder.Build(); 
    _containerProvider = new ContainerProvider(container); 

    var webApiResolver = new AutofacWebApiDependencyResolver(container);   
    GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;  

} 

Типичный контроллер апи выглядит следующим образом:

[Authorize] 
public class MyController : ApiController 
{ 
    public IMyService context { get; set; } 

    public MyController(IMyService context) 
    { 
     this.context = context; 
    } 

    // GET api/dostuff 
    /// <summary> 
    /// Get a list of all dtos 
    /// </summary> 
    /// <returns></returns> 
    public IEnumerable<MyDto> Get() 
    { 
     try 
     {     
      return context.MyDtos.ToList(); 
     } 
     catch (Exception ex) 
     { 
      var message = string.Format("{0} {1} HTTP/1.1 {2} Exception: {3}", Request.Method, Request.RequestUri, HttpStatusCode.MethodNotAllowed, ex.Message); 
      var errorMessage = new System.Web.Http.HttpError(message) { { "ErrorCode", 405 } }; 
      throw new HttpResponseException(ControllerContext.Request.CreateErrorResponse(HttpStatusCode.MethodNotAllowed, errorMessage)); 
     } 
    } 
} 
+0

Возможно, ваши типы услуг не загружаются, когда вы пытаетесь зарегистрировать их с помощью 'builder.RegisterAssemblyTypes (AppDomain.CurrentDomain.GetAssemblies())'. Поэтому попробуйте его с помощью 'BuildManager.GetReferencedAssemblies()': 'builder.RegisterAssemblyTypes (BuildManager.GetReferencedAssemblies())' – nemesv

+0

Он получает услуги, потому что они успешно внедряются в другом месте проекта. Его единственный WebAPI, который дает мне проблемы. –

+0

Кроме того, это не устраняет проблему. –

ответ

6

Если у вас есть контроллеры API в другой сборке, чем ваш веб проект, то вам нужно нужно сказать Autofac где найти контроллеры с Changning:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

для

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

Это будет инструктировать Autofac сканировать сборку MyController и регистра всехApiController производных типов, что он основывает там.

Смежные вопросы