当OwinStartup时如何使用DI容器
这是一个Web API 2项目。
当我使用Ninject实现DI时,我收到一条错误消息
尝试创buildtypes为“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.config
Ninject工作正常,但Startup.OAuthBearerOptions.AccessTokenFormat变为null
如何在OWIN中使用DI容器?
UPDATE
实现IDependencyResolver并使用下面的WebAPI依赖关系parsing器
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
你可能想看看这个博客文章 。
它使用的是Unity,但它最终应该是一样的。
基本上,使用WebAPI依赖关系parsing器。 确保一切都正确映射,应该没问题。
如果在设置DI之后,您的OAuth令牌仍然有问题,请告诉我。
干杯
更新
现在,由于Nuget包Ninject.Web.WebApi.OwinHost,这是更直接的:
Startup.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; } }
我已经相应地更新了wiki。
https://github.com/ninject/Ninject.Web.Common/wiki/Setting-up-a-OWIN-WebApi-application
所有三个托pipe选项。
https://github.com/ninject/Ninject.Web.WebApi/wiki/Setting-up-an-mvc-webapi-application
我们使用与nuget一起安装的标准ninject.MVC5软件包
PM> install-package ninject.MVC5
然后我们像这样configuration我们的绑定。
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") ));
您可能需要调整取决于您定制了多less用户模型。 例如,用户存储绑定可能是类似的。
kernel.Bind<IUserStore<User, int>>() .To<IntUserStore>().InRequestScope();
还有,你需要的用户pipe理器的任何设置,即密码策略都可以在你的用户pipe理器构造器中设置。
以前这可以在示例中的create方法中find,您将不再需要这个。 你也可以摆脱owin获取上下文调用,因为ninject将为你处理分辨率。