Использование Autofac с Web Api 2 и Owin

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

[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)
        {

        }
    }

person Nalaka526    schedule 09.02.2015    source источник
comment
Можете ли вы показать свой код MyController?   -  person hugo    schedule 09.02.2015
comment
Добавлен код @hugo MyController   -  person Nalaka526    schedule 09.02.2015


Ответы (1)


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

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

MyController(ISomeCommandHandler SomeCommandHandler)

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

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

Просмотрите этот раздел документации, где приведены дополнительные примеры концепций регистрации Autofac.

person Sergey Kolodiy    schedule 09.02.2015