.net – 使用ninject解决OWIN WEB API Startup.cs中的依赖关系

前端之家收集整理的这篇文章主要介绍了.net – 使用ninject解决OWIN WEB API Startup.cs中的依赖关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Web Api 2应用程序,两个类都依赖于另一个类,我正在使用ninject来解析依赖关系.
  1. public class AuthorizationServerProvider : OAuthAuthorizationServerProvider
  2. {
  3. private IUserService _userService;
  4.  
  5.  
  6. public AuthorizationServerProvider(IUserService userService)
  7. {
  8. _userService = userService;
  9. }
  10.  
  11. }
  12.  
  13. public class RefreshTokenProvider : IAuthenticationTokenProvider
  14. {
  15. private IUserService _userService;
  16.  
  17. public RefreshTokenProvider(IUserService userService)
  18. {
  19. _userService = userService;
  20. }

在startup.cs类中,我需要使用上面的两个类,但是当然我不能在启动类中使用构造函数注入,因为在Ninject之前初始化它.

这是一个什么办法,以便引用_tokenProvider和
_AuthServerProvider在ConfigureAuth方法

  1. public class Startup
  2. {
  3. private AuthorizationServerProvider _authServerProvider;
  4. private RefreshTokenProvider _tokenProvider;
  5.  
  6. public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; }
  7. public void Configuration(IAppBuilder app)
  8. {
  9. var config = new HttpConfiguration();
  10.  
  11. app.UseNinjectMiddleware(CreateKernel);
  12. app.UseNinjectWebApi(config);
  13.  
  14. ConfigureOAuth(app);
  15.  
  16. WebApiConfig.Register(config);
  17. app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
  18. app.UseWebApi(config);
  19.  
  20. }
  21.  
  22. public void ConfigureOAuth(IAppBuilder app)
  23. {
  24.  
  25. var oAuthServerOptions = new OAuthAuthorizationServerOptions()
  26. {
  27. AllowInsecureHttp = true,//TODO: HTTPS
  28. TokenEndpointPath = new PathString("/token"),AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),Provider = _authServerProvider,RefreshTokenProvider = _tokenProvider
  29. };
  30.  
  31. }

这是CreateKernel方法

  1. private static IKernel CreateKernel()
  2. {
  3. var kernel = new StandardKernel();
  4. try
  5. {
  6. kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
  7. kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
  8.  
  9.  
  10. RegisterServices(kernel);
  11. return kernel;
  12. }
  13. catch
  14. {
  15. kernel.Dispose();
  16. throw;
  17. }
  18. }

这里是我注册我的服务的地方

  1. private static void RegisterServices(IKernel kernel)
  2. {
  3.  
  4. kernel.Bind<SimpleAuthorizationServerProvider>().ToSelf();
  5. kernel.Bind<SimpleRefreshTokenProvider>().ToSelf();
  6.  
  7. }

我在docs赛季跟随了这个建议,但是没有效果.

解决方法

你会这样做错了.嗯,部分是错误的方式反正.您不能让OWIN将依赖项注入到Startup类中.因此,您必须使用配置了app.UseNinjectMiddleware()的内核来解决您的选项配置类.我们会用一个懒惰的内核来做这个.

首先,您应该在Startup.Auth.cs中进行配置.另外,你有一些冗余.. app.UseNinjectWebApi(con​​fig)将调用app.UseWebApi(con​​fig)(见the source).我也不知道你为什么要调用WebApiConfig.Register(),因为通常在Global.asax.cs中调用

无论如何,它应该是这样的(我没有测试过,但应该是接近):

首先,我们将把你的内核创建移到一个懒惰的方法,然后在Startup.Configuration()方法中使用你的UseNinjectMiddleware()调用将Startup类中的lazy kerel作为成员.这最适合我作为一个简单的lambda委托,而不是创建一个静态的CreateKernel方法.

  1. public partial class Startup
  2. {
  3. private readonly Lazy<IKernel> _kernel = new Lazy<IKernel>(() =>
  4. {
  5. var kernel = new StandardKernel();
  6.  
  7. kernel.Load(Assembly.GetExecutingAssembly());
  8.  
  9. // here for brevity,move this to a RegisterServices or similar method,//
  10. kernel.Bind<IOAuthAuthorizationServerOptions>()
  11. .To<MyOAuthAuthorizationServerOptions>();
  12. kernel.Bind<IOAuthAuthorizationServerProvider>()
  13. .To<AuthorizationServerProvider>();
  14. kernel.Bind<IAuthenticationTokenProvider>().To<RefreshTokenProvider>();
  15. kernel.Bind<IUserService>().To<MyUserService>();
  16. return kernel;
  17. });
  18.  
  19. public void Configuration(IAppBuilder app)
  20. {
  21. app.UseNinjectMiddleware(() => _kernel.Value);
  22. var config = new HttpConfiguration();
  23. app.UseNinjectWebApi(config);
  24.  
  25. ConfigureAuth(app);
  26. }
  27. }

然后在你的ConfigureAuth()

  1. public void ConfigureAuth(IAppBuilder app)
  2. {
  3. // .... other auth code
  4.  
  5. // Yes,boo hiss,service location,not much choice...
  6. // Setup Authorization Server
  7. app.USEOAuthAuthorizationServer(_kernel.Value
  8. .Get<MyOAuthAuthorizationServerOptions>().GetOptions());
  9. }

然后创建一个界面:

  1. public interface IOAuthAuthorizationServerOptions
  2. {
  3. OAuthAuthorizationServerOptions GetOptions();
  4. };

创建您的实现:

  1. public class MyOAuthAuthorizationServerOptions : IOAuthAuthorizationServerOptions
  2. {
  3. private IOAuthAuthorizationServerProvider _provider;
  4. private IAuthenticationTokenProvider _tokenProvider;
  5.  
  6. public MyOAuthAuthorizationServerOptions(IAuthenticationTokenProvider tProvider,IOAuthAuthorizationServerProvider provider)
  7. {
  8. _provider = provider;
  9. _tokenProvider = tProvider;
  10. }
  11. public OAuthAuthorizationServerOptions GetOptions()
  12. {
  13. return new OAuthAuthorizationServerOptions()
  14. {
  15. AllowInsecureHttp = true,//TODO: HTTPS
  16. TokenEndpointPath = new PathString("/token"),Provider = _provider,RefreshTokenProvider = _tokenProvider
  17. };
  18. }
  19. }

编辑(4/6/15):

经过进一步的思考,我认为懒惰< T>添加一个真正不必要的附加参考.这可以通过更清晰的方式进行修改,以达到相同的效果

创建一个新的Startup.Ninject.cs类,并将其放在App_Start中:

  1. public partial class Startup
  2. {
  3. public IKernel ConfigureNinject(IAppBuilder app)
  4. {
  5. var config = new HttpConfiguration();
  6. var kernel = CreateKernel();
  7. app.UseNinjectMiddleware(() => kernel)
  8. .UseNinjectWebApi(config);
  9.  
  10. return kernel;
  11. }
  12.  
  13. public IKernel CreateKernel()
  14. {
  15. var kernel = new StandardKernel();
  16. kernel.Load(Assembly.GetExecutingAssembly());
  17. return kernel;
  18. }
  19. }
  20.  
  21. public class NinjectConfig : NinjectModule
  22. {
  23. public override void Load()
  24. {
  25. RegisterServices();
  26. }
  27.  
  28. private void RegisterServices()
  29. {
  30. kernel.Bind<IOAuthAuthorizationServerOptions>()
  31. .To<MyOAuthAuthorizationServerOptions>();
  32. kernel.Bind<IOAuthAuthorizationServerProvider>()
  33. .To<AuthorizationServerProvider>();
  34. kernel.Bind<IAuthenticationTokenProvider>().To<RefreshTokenProvider>();
  35. kernel.Bind<IUserService>().To<MyUserService>();
  36. }
  37. }

然后,在启动中这样做:

  1. public partial class Startup
  2. {
  3. public void Configuration(IAppBuilder app)
  4. {
  5. var kernel = ConfigureNinject(app);
  6. ConfigureAuth(app,kernel);
  7. }
  8. }

最后,修改ConfigureAuth以取代第二个参数.

  1. public void ConfigureAuth(IAppBuilder app,IKernel kernel)
  2. {
  3. // .... other auth code
  4.  
  5. // Yes,not much choice...
  6. // Setup Authorization Server
  7. app.USEOAuthAuthorizationServer(
  8. kernel.Get<MyOAuthAuthorizationServerOptions>().GetOptions());
  9. }

猜你在找的HTML相关文章