OWIN WebAPI 简单注入器 EFCoreInMemoryDB 注入
OWIN WebAPI Simple Injector EFCoreInMemoryDB injection
我正在使用 OWIN 构建服务,我想使用 UserDbContext(DBOptions) 在内存数据库中注入 EF 核心
Startup.cs:
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
// How to Register In memory DB?!
// I get an exception on DbContextOptions< in UserContext
container.Register<DbContext>(() => {
var optionsBuilder = new DbContextOptionsBuilder<UserContext>()
.UseInMemoryDatabase("UserContext");
return new UserContext(optionsBuilder.Options);
});
container.Register<IUserRepository, UserRepository>();
config.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
我已经足够了,所以我在启动服务时没有遇到异常。但是当我打电话给 API 时,我得到一个例外:
The constructor of type UserContext contains the parameter with name 'options' and type DbContextOptions<UserContext> that is not registered. Please ensure DbContextOptions<TUserContext> is registered, or change the constructor of UserContext
UserRepository.cs
public class UserRepository : IUserRepository
{
private readonly UserContext context;
public UserRepository(UserContext context)
{
this.context = context;
}
}
UserContext.cs
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options)
: base()
{
}
public DbSet<User> Users { get; set; }
}
那么如何使用 Simple Injector UserContext
在 ef 核心内存数据库中注册?使用标准 .NET Core DI 可以非常容易地做到这一点。
发生错误是因为您没有注册 UserContext
,而只注册了 DbContext
。将您的 container.Register<DbContext>(...)
注册更改为以下内容:
container.Register<UserContext>(() => ...);
另请注意,您目前使用 Transient
生活方式注册了 UserContext
,而 DbContext
最典型的生活方式是 Scoped
:
container.Register<UserContext>(() => ..., Lifestyle.Scoped);
It would be super easy to do this using standard .NET Core DI.
使用 Simple Injector 也非常简单 :) 使用 Core DI,您基本上需要相同的注册。
让您感到困惑的是,默认情况下,Simple Injector v4 会尝试为您实例化具体的未注册依赖项。 UserContext
没有注册,虽然是具体的。 Simple Injector 尝试创建它,但发现它无法解析其依赖项之一。这就是错误消息指向 DbContextOptions<UserContext>
而不是错误 "you didn’t register UserContext".
的原因
为解决此问题,此 "resolution of unregistered concrete types" 行为将从 v5 开始更改。默认情况下,v5 将不再 解析未注册的具体类型。这样更安全,并且会导致更明显的异常消息。
随着 Simple Injector v4.5 的推出,我们引入了一个选项,允许您切换到即将推出的 v5 行为。我的建议是立即使用这个新设置,因为它是更安全的行为,并且可以防止您在切换到 v5 后遇到错误。您可以按如下方式执行此操作:
var container = new Container();
container.Options.ResolveUnregisteredConcreteTypes = false;
我正在使用 OWIN 构建服务,我想使用 UserDbContext(DBOptions) 在内存数据库中注入 EF 核心
Startup.cs:
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
// How to Register In memory DB?!
// I get an exception on DbContextOptions< in UserContext
container.Register<DbContext>(() => {
var optionsBuilder = new DbContextOptionsBuilder<UserContext>()
.UseInMemoryDatabase("UserContext");
return new UserContext(optionsBuilder.Options);
});
container.Register<IUserRepository, UserRepository>();
config.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
我已经足够了,所以我在启动服务时没有遇到异常。但是当我打电话给 API 时,我得到一个例外:
The constructor of type UserContext contains the parameter with name 'options' and type DbContextOptions<UserContext> that is not registered. Please ensure DbContextOptions<TUserContext> is registered, or change the constructor of UserContext
UserRepository.cs
public class UserRepository : IUserRepository
{
private readonly UserContext context;
public UserRepository(UserContext context)
{
this.context = context;
}
}
UserContext.cs
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options)
: base()
{
}
public DbSet<User> Users { get; set; }
}
那么如何使用 Simple Injector UserContext
在 ef 核心内存数据库中注册?使用标准 .NET Core DI 可以非常容易地做到这一点。
发生错误是因为您没有注册 UserContext
,而只注册了 DbContext
。将您的 container.Register<DbContext>(...)
注册更改为以下内容:
container.Register<UserContext>(() => ...);
另请注意,您目前使用 Transient
生活方式注册了 UserContext
,而 DbContext
最典型的生活方式是 Scoped
:
container.Register<UserContext>(() => ..., Lifestyle.Scoped);
It would be super easy to do this using standard .NET Core DI.
使用 Simple Injector 也非常简单 :) 使用 Core DI,您基本上需要相同的注册。
让您感到困惑的是,默认情况下,Simple Injector v4 会尝试为您实例化具体的未注册依赖项。 UserContext
没有注册,虽然是具体的。 Simple Injector 尝试创建它,但发现它无法解析其依赖项之一。这就是错误消息指向 DbContextOptions<UserContext>
而不是错误 "you didn’t register UserContext".
为解决此问题,此 "resolution of unregistered concrete types" 行为将从 v5 开始更改。默认情况下,v5 将不再 解析未注册的具体类型。这样更安全,并且会导致更明显的异常消息。
随着 Simple Injector v4.5 的推出,我们引入了一个选项,允许您切换到即将推出的 v5 行为。我的建议是立即使用这个新设置,因为它是更安全的行为,并且可以防止您在切换到 v5 后遇到错误。您可以按如下方式执行此操作:
var container = new Container();
container.Options.ResolveUnregisteredConcreteTypes = false;