gpt4 book ai didi

c# - OwinStartup时如何使用DI容器

转载 作者:IT王子 更新时间:2023-10-29 03:44:10 25 4
gpt4 key购买 nike

这是一个 Web API 2 项目。

当我使用 Ninject 实现 DI 时,我收到一条错误消息

尝试创建“TokenController”类型的 Controller 时发生错误。确保 Controller 具有无参数公共(public)构造函数。

[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 容器?

更新

实现 IDependencyResolver 并使用 WebAPI 依赖解析器,如下所示

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

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

app.UseWebApi(config);
}

NinjectDependencyResolver


在简单的注入(inject)器案例中

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

最佳答案

您可能想看看 this blog post .

它使用的是 Unity,但最终应该是一样的。

基本上,使用 WebAPI 依赖项解析器。确保一切都正确映射,应该没问题。

如果在设置 DI 后您的 OAuth token 仍然有问题,请告诉我。

干杯

关于c# - OwinStartup时如何使用DI容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com