C# OWIN WebAPI简易注射器EFCoreInMemoryDB注射

C# OWIN WebAPI简易注射器EFCoreInMemoryDB注射,c#,dependency-injection,owin,simple-injector,C#,Dependency Injection,Owin,Simple Injector,我正在使用OWIN构建一个服务,我想使用UserDbContextDBOptions在内存数据库中注入efcore Startup.cs: 公共无效配置appBuilder appBuilder { HttpConfiguration config=新的HttpConfiguration; config.maphttpAttribute路由; config.Routes.MapHttpRoute 名称:DefaultApi, routeTemplate:api/{controller}/{id}

我正在使用OWIN构建一个服务,我想使用UserDbContextDBOptions在内存数据库中注入efcore

Startup.cs:

公共无效配置appBuilder appBuilder { HttpConfiguration config=新的HttpConfiguration; config.maphttpAttribute路由; config.Routes.MapHttpRoute 名称:DefaultApi, routeTemplate:api/{controller}/{id}, 默认值:新建{id=RouteParameter.Optional} ; var容器=新容器; container.Options.DefaultScopedLifestyle=新的AsyncScopedLifestyle; //如何在内存数据库中注册?! //我在UserContext中的DbContextOptions<上得到一个异常 container.Register=>{ var optionsBuilder=new DbContextOptionsBuilder .UseInMemoryDatabaseUserContext; 返回新的UserContextoptionsBuilder.Options; }; 容器。登记; config.DependencyResolver= 新的SimpleInjectorWebApidencyResolverContainer; } 我已经做得够多了,所以在启动服务时不会出现异常。但是,当我调用API时,会出现一个异常,即:

UserContext类型的构造函数包含名为“options”且类型为DbContextOptions的参数,该参数未注册。请确保已注册DbContextOptions,或更改UserContext的构造函数

UserRepository.cs

公共类UserRepository:IUserRepository { 私有只读用户上下文; 公共UserRepositoryUserContext上下文 { this.context=上下文; } } UserContext.cs

公共类UserContext:DbContext { 公共用户ContextDBContextOptions选项 :基本 { } 公共数据库集用户{get;set;} }
那么,如何使用简单的注入器在ef核心内存数据库中注册UserContext呢?使用标准的.NET Core DI可以非常容易地做到这一点。

发生错误的原因是您没有注册UserContext,而只注册了DbContext。更改您的容器。注册。。。向以下机构注册:

container.Register<UserContext>(() => ...);
使用标准的.NETCoreDI做这件事会非常容易

使用简单的注入器也非常容易:使用Core DI,基本上需要相同的注册

让您困惑的是,默认情况下,Simple Injector v4试图为您实例化具体的未注册依赖项。UserContext是具体的,但未注册。Simple Injector尝试创建它,但发现它无法解析它的一个依赖项。这就是为什么错误消息指向DbContextOptions,而错误是您没有注册UserContext

为了解决这个问题,未注册的具体类型行为的解析将从v5开始改变。默认情况下,v5不再解析未注册的具体类型。这样更安全,并且会产生更明显的异常消息

随着Simple Injector v4.5的推出,我们引入了一个选项,允许您切换到即将到来的v5行为。我的建议是立即使用这个新设置,因为它更安全,并且在切换到v5时防止出现错误。您可以按如下方式执行此操作:

var container = new Container();

container.Options.ResolveUnregisteredConcreteTypes = false;

你太棒了,如果我们再见面,我会给你买杯啤酒;DD
var container = new Container();

container.Options.ResolveUnregisteredConcreteTypes = false;