热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:在Owin启动期间,SimpleInjector无法为每个WebAPI请求注册类注入分享

在Owin启动期间,SimpleInjector无法为每个WebAPI请求注册类注入我正在使用Owin,WebAPI,entityframework,ASP.NET身份创建API。

在Owin启动期间,Simple Injector无法为每个Web API请求注册类注入

我正在使用Owin,Web API,entity framework,ASP.NET身份创建API。 我使用Simple Injector作为我选择的DI框架。

在Owin启动过程中,我想用一些示例数据为我的数据库建立种子。 这是由实现IDatabaseInitializer的类处理的,它看起来像这样:

 public class MyDbInitializer : DropCreateDatabaseAlways { private readonly IUserManager _userManager; public MyDbInitializer(IUserManager userManager) { _userManager = userManager; } protected override void Seed(MyDataContext context) { SeedIdentities(); } private void SeedIdentities() { var user = new User { UserName = "someUsername", Email = "some@email.com" }; _userManager.CreateAsync(user, "Password"); } 

IUserManager是ASP.NET Identiy UserManager类的代理,它间接依赖于IUnitOfWork 。 如果你想知道, IUserManager注册如下:

 container.Register(typeof(IUserManager), () => container.GetInstance().Create()); 

因为我想为每个Web API请求使用一个工作单元,所以我已将IUnitOfWork注册如下:

 container.RegisterWebApiRequest(); 

除了解析MyDbInitializer类中的IUserManager依赖项之外,这对于所有事情都很MyDbInitializer 。 在应用程序启动期间,SimpleInjector失败并出现以下ActivationException:

 SimpleInjector.ActivationException was unhandled by user code HResult=-2146233088 Message=The registered delegate for type IUserManagerFactory threw an exception. The IUnitOfWork is registered as 'Web API Request' lifestyle, but the instance is requested outside the context of a Web API Request. Source=SimpleInjector StackTrace: at SimpleInjector.InstanceProducer.GetInstance() at SimpleInjector.Container.GetInstance[TService]() at Project.WebApi.CompositionRoot.SimpleInjectorCompositionRoot.b__c() in c:codeProjectProject.WebApiCompositionRootSimpleInjectorCompositionRoot.cs:line 130 at lambda_method(Closure ) at lambda_method(Closure ) at SimpleInjector.InstanceProducer.GetInstance() InnerException: SimpleInjector.ActivationException HResult=-2146233088 Message=The IUnitOfWork is registered as 'Web API Request' lifestyle, but the instance is requested outside the context of a Web API Request. Source=SimpleInjector StackTrace: at SimpleInjector.Scope.GetScopelessInstance[TService,TImplementation](ScopedRegistration`2 registration) at SimpleInjector.Scope.GetInstance[TService,TImplementation](ScopedRegistration`2 registration, Scope scope) at SimpleInjector.Advanced.Internal.LazyScopedRegistration`2.GetInstance(Scope scope) at lambda_method(Closure ) at SimpleInjector.InstanceProducer.GetInstance() InnerException: 

我猜Owin Startup.cs类被认为是在Web API请求生命周期之外,并且数据库初始化程序中的构造函数注入失败,因为它由Startup.cs类调用。

我不确定如何解决这个问题。 我应该使用混合生活方式来注册IUnitOfWork ,还是有更好的解决方案?

你是对的。 在启动期间,没有Web API请求。 幸运的是, WebApiRequestLifestyle (由RegisterWebApiRequest扩展方法使用)使用了EntcutionContextLifestyle ,因此按照以下方式“模拟”Web请求非常简单:

 // using SimpleInjector.Extensions.ExecutionContextScoping; using (container.BeginExecutionContextScope()) { var initializer = container.GetInstance(); intializer.InitializeDatabase(); } 

此外,如果您托管在IIS中,集成管道将为管道的每个阶段创建一个新的CallContext,这是SimpleInjector存储执行上下文的地方。

因此,如果在管道的不同阶段中的一个中间件中执行BeginExecutionContextScope而不是运行Web API代码,则SimpleInjector执行上下文将不会持久存在。

您可以使用app.UseStageMarker来调整中间件在管道中执行的位置,但是我无法让SimpleInjector执行上下文通过我的所有OWIN auth中间件继续存在,然后进入Web API。 尽管使用相同的SimpleInejctor容器,但DelegatingHandlerProxy中的以下代码始终会创建新的执行范围

上述就是C#学习教程:在Owin启动期间,Simple Injector无法为每个Web API请求注册类注入分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

 protected async override Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // Trigger the creation of the DependencyScope to ensure the instance // is resolved within that scope. request.GetDependencyScope(); } 


推荐阅读
author-avatar
瞬间的永恒2502931493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有