繁体   English   中英

OWIN WebAPI简单注入器EFCoreInMemoryDB注入

[英]OWIN WebAPI Simple Injector EFCoreInMemoryDB injection

我正在使用OWIN构建服务,我想使用UserDbContext(DBOptions)将EF内核注入内存db中

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 <UserContext>未注册。 请确保DbContextOptions <TUserContext>已注册,或更改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核心内存db中注册? 使用标准的.NET Core DI做到这一点将非常容易。

发生错误是因为您没有注册UserContext ,而只有DbContext 将您的container.Register<DbContext>(...)注册更改为以下内容:

container.Register<UserContext>(() => ...);

还要注意,您当前使用的是Transient生活方式注册UserContext ,而DbContext的最典型生活方式是Scoped

container.Register<UserContext>(() => ..., Lifestyle.Scoped);

使用标准的.NET Core DI做到这一点将非常容易。

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

让您感到困惑的是,默认情况下,Simple Injector v4会尝试为您实例化未注册的具体依赖关系。 UserContext未注册。 Simple Injector尝试创建它,但是发现它无法解析其依赖项之一。 这就是错误消息指向DbContextOptions<UserContext> ,而错误是“您没有注册UserContext”。

要解决此问题,此“未注册的具体类型的解析”行为将从v5开始更改。 默认情况下,v5将不再解析未注​​册的具体类型。 这样比较安全,并且会导致出现更明显的异常消息。

随着Simple Injector v4.5的引入,我们引入了一个选项,使您可以切换到即将到来的v5行为。 我的建议是立即使用此新设置,因为这是更安全的行为,可以防止您在切换到v5后遇到错误。 您可以按照以下步骤进行操作:

var container = new Container();

container.Options.ResolveUnregisteredConcreteTypes = false;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM