Как использовать контейнер для OwinStartup

Он'ы проект веб-API 2.

Когда я реализую Ди с помощью Ninject, я получил сообщение об ошибке

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

[assembly: OwinStartup(typeof(Web.Startup))]

namespace Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            ConfigureWebApi(app);
        }
    }
}

public class TokenController : ApiController
{

    private IUserService _userService;

    public TokenController(IUserService userService)
    {
        this._userService = userService;
    }

    [Route("api/Token")]
    public HttpResponseMessage PostToken(UserViewModel model)
    {
        if (_userService.ValidateUser(model.Account, model.Password))
        {
            ClaimsIdentity identity = new ClaimsIdentity(Startup.OAuthBearerOptions.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, model.Account));
            AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
            var currentUtc = new SystemClock().UtcNow;
            ticket.Properties.IssuedUtc = currentUtc;
            ticket.Properties.ExpiresUtc = currentUtc.Add(TimeSpan.FromMinutes(30));
            return new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent<object>(new
                {
                    UserName = model.Account,
                    AccessToken = Startup.OAuthBearerOptions.AccessTokenFormat.Protect(ticket)
                }, Configuration.Formatters.JsonFormatter)
            };
        }

        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
}

Когда я добавить <добавить ключ="в долг:AutomaticAppStartup на" значение=на"ложные" и /> в web.конфиг

Ninject работает отлично, но стартап.OAuthBearerOptions.AccessTokenFormat становится равным null

Как использовать контейнер с долг?

Обновление

Осуществлять IDependencyResolver и использовать решатель зависимостей веб-API, как показано ниже

public void ConfigureWebApi(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel());

    app.UseWebApi(config);
}

NinjectDependencyResolver


В простом случае инжектор

public void ConfigureWebApi(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    var container = new Container();
    container.Register<IUserService, UserService>();
    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

    app.UseWebApi(config);
}

SimpleInjectorWebApiDependencyResolver

Комментарии к вопросу (4)
Решение

Вы, возможно, захотите взглянуть на этот блог](http://damienbod.wordpress.com/2013/10/01/self-host-webapi-with-owin-and-unity/).

Это's используя единства, но это должно закончиться-будет то же самое.

В принципе, использовать веб-API решатель зависимостей. Убедитесь, что все отображается правильно и все будет хорошо.

Если после настройки Ди вы все еще имеете проблему с вашим маркера OAuth-авторизации, дайте мне знать.

Ура

Комментарии (1)

Обновление

Теперь это более прямо вперед, благодаря пакет NuGet Ninject.Веб.Веб-API.OwinHost:

Запуска.в CS

using Ninject;
using Ninject.Web.Common.OwinHost;
using Ninject.Web.WebApi.OwinHost;
using Owin;
using System.Web.Http;

namespace Xxx
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute("DefaultApi", "myservice/{controller}/{id}", new { id = RouteParameter.Optional });

            app.UseNinjectMiddleware(CreateKernel);
            app.UseNinjectWebApi(config);
        }
    }
    public static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();

        kernel.Bind().To();
        return kernel;
    }
}

Я обновил соответственно Вики.

https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application

Все три варианта хостинга.

https://github.com/ninject/Ninject.Web.WebApi/wiki/Setting-up-an-mvc-webapi-application

Комментарии (1)

Мы используем стандартный ninject.Установлен пакет MVC5 с NuGet

ТЧ> установка пакета ninject.MVC5

Затем мы настроим привязки вроде так.

kernel.Bind()
    .To()
    .InRequestScope();

kernel.Bind()
    .To()
    .InRequestScope();

kernel.Bind()
    .To()
    .InRequestScope()
    .WithConstructorArgument("ApplicationName");

kernel.Bind().ToSelf().InRequestScope()
    .WithPropertyValue("UserTokenProvider",
        new DataProtectorTokenProvider(
            kernel.Get().Create("EmailConfirmation")
            ));

Вам может потребоваться настроить зависит от того, сколько вы настраивали вашу модель пользователя. Например, привязка пользователей магазина может быть что-то подобное.

kernel.Bind()
      .To().InRequestScope();

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

Ранее этот может быть найден в создании метода в образце, вы больше не нуждаетесь в этом. также теперь вы можете избавиться от OWIN в контекстном звонки, как ninject будет обрабатывать разрешение для вас.

Комментарии (2)