这是一个Web API 2项目。
当我使用Ninject实现DI时,我收到了一条错误消息
尝试创建“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 变为空
如何在OWIN中使用DI容器?
更新
实施IDependencyResolver并使用下面的WebAPI依赖关系解析器
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);
}
答案 0 :(得分:34)
您可能需要查看this blog post。
它正在使用Unity,但最终应该是相同的。
基本上,使用WebAPI依赖关系解析器。确保所有内容都已正确映射,并且应该没问题。
如果您在设置DI后仍然存在OAuth令牌问题,请与我们联系。
干杯
答案 1 :(得分:17)
更新
由于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;
}
}
我已相应更新了维基。
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
答案 2 :(得分:2)
我们使用与nuget一起安装的标准ninject.MVC5包
PM&GT; 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();
您也可以在用户管理器构造函数中设置所需的用户管理器设置,即密码策略。
以前可以在示例中的create方法中找到它,您将不再需要它。 你也可以摆脱owin get上下文调用,因为ninject将为你处理解决方案。