OWIN WebAPI Простой инжектор EFCoreInMemoryDB инъекция - PullRequest
0 голосов
/ 20 мая 2019

Я создаю сервис, используя OWIN, и я хочу внедрить ядро ​​EF в память базы данных, используя UserDbContext (DBOptions)

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; }
}

Так какВы регистрируетесь в ef core memory db, используя UserContext, используя Simple Injector?Было бы очень легко сделать это, используя стандартный .NET Core DI.

1 Ответ

1 голос
/ 20 мая 2019

Ошибка возникает из-за того, что вы не зарегистрировали UserContext, а только DbContext.Измените вашу container.Register<DbContext>(...) регистрацию на следующую:

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

Также обратите внимание, что вы в настоящее время зарегистрировали UserContext, используя стиль жизни Transient, в то время как наиболее типичный стиль жизни для DbContext - Scoped:

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

Это было бы очень легко сделать с помощью стандартного .NET Core DI.

Это очень просто и с Simple Injector :) С CoreD Мне нужна та же регистрация.

То, что вас смутило, - это то, что 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;
...