База данных Seeding ServiceStack - PullRequest
0 голосов
/ 28 июня 2018

В основных проектах .net я делаю посев в файле Program.cs следующим образом:

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var context = services.GetRequiredService<ApplicationDbContext>();

        //.. do seeding
    }
    catch
    {

    }
}

host.Run();

В стеке сервисов сервисы зарегистрированы в одном месте? Я попробовал код ниже, но var db = context.OpenDbConnection() выдает исключение, что сервис не зарегистрирован:

Служба для типа 'ServiceStack.Data.IDbConnectionFactory' не зарегистрирована.

Вот как я это называю:

var host = BuildWebHost(args);

using (var scope = host.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var context = services.GetRequiredService<IDbConnectionFactory>();


        using (var db = context.OpenDbConnection())
        {
            if(!db.Select<Register>(x => x.Email == "test@example").Any())
            {
                db.Insert(new Register
                {
                    Email = "test@example.com",
                    Password = "1234"
                });
            }

        }

        //.. do seeding
    }
    catch
    {

    }

 }

host.Run();

Вот так я регистрирую его в Startup.cs Configure ()

container.Register<IDbConnectionFactory>(c =>
    new OrmLiteConnectionFactory(_sqliteFileDb, SqliteDialect.Provider));

container.Register<IAuthRepository>(c =>
    new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));

container.Resolve<IAuthRepository>().InitSchema();

Как правильно мне зарегистрироваться и получить контекст базы данных?

1 Ответ

0 голосов
/ 28 июня 2018

Вы ищете зависимости в IOC .NET Core, но зависимости , зарегистрированные в IOC ServiceStack, видны только для ServiceStack .

Обычно вы просто заполняете данные после регистрации зависимости, так как они только регистрируются и настраиваются при запуске, например:

container.Register<IDbConnectionFactory>(c =>
    new OrmLiteConnectionFactory(_sqliteFileDb, SqliteDialect.Provider));

using (var db = container.Resolve<IDbConnectionFactory>().Open())
{
    SeedData(db);
}

В противном случае вы можете получить доступ к зависимостям в IOC ServiceStack с помощью:

var dbFactory = HostContext.TryResolve<IDbConnectionFactory>();

using (var db = dbFactory.Open())
{
}
...