OwinStartup时如何使用DI容器

E-C*_*Liu 64 c# dependency-injection ninject asp.net-web-api owin

这是一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我添加<add key="owin:AutomaticAppStartup" value="false" />到web.config

Ninject工作正常,但Startup.OAuthBearerOptions.AccessTokenFormat变为null

如何在OWIN中使用DI容器?

UPDATE

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

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

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

    app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

NinjectDependencyResolver


在Simple Injector案例中

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);
}
Run Code Online (Sandbox Code Playgroud)

SimpleInjectorWebApiDependencyResolver

Max*_*ler 34

你可能想看一下这篇博客文章.

它使用Unity但最终应该是相同的.

基本上,使用WebAPI依赖关系解析器.确保所有内容都已正确映射,并且应该没问题.

如果您在设置DI后仍然存在OAuth令牌问题,请与我们联系.

干杯


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已相应更新了wiki.

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