我正在使用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时,出现了一个异常:
UserContext类型的构造函数包含名称为'options'的参数,并且类型DbContextOptions
未注册。请确保DbContextOptions 已注册,或更改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; }
}
那么,如何使用简单注入器通过UserContext
在ef核心内存db中注册?使用标准的.NET Core DI做到这一点非常容易。
答案 0 :(得分:1)
发生错误是因为您没有注册UserContext
,而只有DbContext
。将您的container.Register<DbContext>(...)
注册更改为以下内容:
container.Register<UserContext>(() => ...);
还请注意,您当前使用UserContext
生活方式注册了Transient
,而DbContext
的最典型生活方式是Scoped
:
container.Register<UserContext>(() => ..., Lifestyle.Scoped);
使用标准的.NET Core DI做到这一点非常容易。
使用简单进样器也非常容易:)使用Core DI,您基本上需要相同的注册。
让您感到困惑的是,默认情况下,Simple Injector v4会尝试为您实例化具体的未注册依赖关系。 UserContext
未注册,但具体。 Simple Injector尝试创建它,但是发现它无法解析其依赖项之一。这就是错误消息指向DbContextOptions<UserContext>
的原因,而错误是“您没有注册UserContext”。
为解决此问题,此“未注册的具体类型的解析”行为将从v5开始更改。默认情况下,v5将 not 不再解析未注册的具体类型。这样比较安全,并且会导致出现更明显的异常消息。
随着Simple Injector v4.5的引入,我们引入了一个选项,使您可以切换到即将到来的v5行为。我的建议是立即使用此新设置,因为这是更安全的行为,可以防止您在切换到v5后遇到错误。您可以按照以下步骤进行操作:
var container = new Container();
container.Options.ResolveUnregisteredConcreteTypes = false;