2015-02-09 2 views
0

Я впервые в библиотеки DI и пытаюсь использовать Autofac в проекте WebApi 2 с Owin. Это мой класс Owin Startup,Использование Autofac с Web Api 2 и Owin

[assembly: OwinStartup(typeof(FMIS.SIGMA.WebApi.Startup))] 
namespace FMIS.SIGMA.WebApi 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var builder = new ContainerBuilder(); 
      var config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
      var container = builder.Build(); 
      config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
      app.UseAutofacMiddleware(container); 
      app.UseAutofacWebApi(config); 
      app.UseWebApi(config); 

      ConfigureOAuth(app); 
     } 

     public void ConfigureOAuth(IAppBuilder app) 
     { 
      OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
      { 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
       Provider = new SimpleAuthorizationServerProvider() 
      }; 

      // Token Generation 
      app.UseOAuthAuthorizationServer(OAuthServerOptions); 
      app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

     } 

    } 
} 

Когда я вызываю метод Api я получаю эту ошибку

Произошла ошибка при попытке создать контроллер типа 'MyController. Убедитесь, что контроллер имеет пустой конструктор .

Что мне здесь не хватает?


MyController код что-то вроде этого

public class MyController : ApiController 
    { 
     ISomeCommandHandler someCommanHandler; 

     public MyController(ISomeCommandHandler SomeCommandHandler) 
     { 
      this.someCommanHandler = SomeCommandHandler; 

     } 

     // POST: api/My 
     public void Post([FromBody]string value) 
     { 
      someCommanHandler.Execute(new MyCommand() { 
       Name = "some value" 
      }); 
     } 

     // GET: api/My 
     public IEnumerable<string> Get() 
     { 

     } 

     // GET: api/My/5 
     public string Get(int id) 
     { 

     } 
    } 
+0

Можете ли вы показать свой код MyController? – hugoterelle

+0

Добавлен код myController @hugo – Nalaka526

ответ

3

Вы установили DependencyResolver к AutofacWebApiDependencyResolver, так Autofac вступает в игру и конкретизирует зависимостей для вас. Теперь вам нужно явно указать Autofac, какие конкретные реализации следует использовать, когда требуется интерфейс интерфейса.

Ваш контроллер требует экземпляр ISomeCommandHandler:

MyController(ISomeCommandHandler SomeCommandHandler) 

Таким образом, вам нужно настроить типы, которые предоставляют этот интерфейс:

builder.RegisterType<CommandHandler>.As<ISomeCommandHandler>(); 

взглянуть на эту documentation section дополнительные примеры о концепциях регистрации Autofac ,