Как использовать контейнер DI при OwinStartup
это проект Web API 2.
когда я реализую DI с помощью 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);
}
}
когда я добавить <add key="owin:AutomaticAppStartup" value="false" />
в web.конфигурации
Ninject работает отлично, но Автозагрузка.OAuthBearerOptions.AccessTokenFormat становится null
как использовать DI контейнер с ОУИНОМ?
обновление
реализовать IDependencyResolver и использовать WebAPI Dependency Resolver, как показано ниже
public void ConfigureWebApi(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.DependencyResolver = new NinjectDependencyResolver(NinjectWebCommon.CreateKernel());
app.UseWebApi(config);
}
в простом случае инжектор
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);
}
3 ответа:
возможно, вы захотите взглянуть на этот блог.
Он использует Unity, но он должен быть таким же.
в основном, используйте преобразователь зависимостей WebAPI. Убедитесь, что все отображается правильно и все будет хорошо.
Если после настройки вашего DI у вас все еще есть проблемы с вашим токеном OAuth, дайте мне знать.
Ура
обновление
теперь это более прямолинейно благодаря пакету 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<IMyService>().To<MyService>(); 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
мы используем стандартный ninject.Пакет MVC5 установлен с nuget
PM> install-package ninject.MVC5
затем мы настраиваем наши привязки так.
kernel.Bind<IDbContext, DbContext>() .To<BlogContext>() .InRequestScope(); kernel.Bind<IUserStore<User>>() .To<UserStore<User>>() .InRequestScope(); kernel.Bind<IDataProtectionProvider>() .To<DpapiDataProtectionProvider>() .InRequestScope() .WithConstructorArgument("ApplicationName"); kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope() .WithPropertyValue("UserTokenProvider", new DataProtectorTokenProvider<User>( kernel.Get<IDataProtectionProvider>().Create("EmailConfirmation") ));
возможно, Вам потребуется настроить в зависимости от того, насколько вы настроили свою пользовательскую модель. Например, привязка хранилища пользователей может быть чем-то вроде.
kernel.Bind<IUserStore<User, int>>() .To<IntUserStore>().InRequestScope();
также любая настройка пользовательского кормушки, которую вы требуете, т. е. политики паролей могут быть установлены в конструкторе user manager.
ранее это можно было найти в методе create в примере, вы больше не будете требовать этого. также теперь вы можете избавиться от контекстных вызовов owin get, поскольку ninject будет обрабатывать разрешение для вас.