Как внедрить или подключить ormlite в репозитории ServiceStack?

Я хочу получить доступ к базе данных из репозитория, а не из класса обслуживания (для увеличения разделения - не уверен, что это слишком много), т.е.

public class TodoRepository // : BaseRepository derive the class and inject IDbConnection somehow? 
{        
    public List<Todo> GetByIds(long[] ids)
    {
        return Db.Select<Todos>(t => Sql.In(t.id, ids));   <-- how to get 'Db' in here
    }
}

Базовый класс службы уже обеспечивает прямой доступ к базам данных через ormlite с использованием объекта 'Db', таким образом:

public class Service : IService, IRequiresRequestContext, IServiceBase, IResolver, IDisposable
{
    public virtual IDbConnection Db { get; }
}

Приводит меня к мысли, что я могу сделать это, возможно, чтобы я мог использовать 'Db' в производных классах:

public class BaseRepository: IDisposable
{
    public virtual IDbConnection Db { get; }
}

В моем AppHost есть эта строка для передачи строки подключения и регистрации репозитория:

container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register(new TodoRepository());

Как внедрить или автоматически подключить IDbConnection к классу BaseRepository? Я уже попытался зарегистрировать и автоматически подключить BaseRepository в AppHost безуспешно.

1 ответ

Решение

Пожалуйста, смотрите раздел регистрации Autowire в вики-документах IOC. Это просто регистрирует одноэлементный экземпляр, так как вы передаете существующий экземпляр, IOC не может контролировать создание типа:

container.Register(new TodoRepository());

Если вы хотите, чтобы он был автоматически подключен, вам нужно использовать один из API с автоматическим подключением:

container.RegisterAutoWired<TodoRepository>();
container.RegisterAutoWiredAs<TodoRepository,ITodoRepository>();
container.RegisterAs<TodoRepository,ITodoRepository>(); //shorter alias

container.RegisterAutoWiredType(typeof(MyType));
container.RegisterAutoWiredType(typeof(MyType),typeof(IMyType));
container.RegisterAutoWiredTypes(typeof(MyType),typeof(MyType2),typeof(MyType3));

Или вы можете вручную управлять созданием вашего экземпляра, указав метод фабрики:

container.Register(c => new TodoRepository { 
    DbFactory = c.Resolve<IDbConnectionFactory>() 
});

Если вы хотите ввести IDbConnection вместо этого убедитесь, что он находится в Request или же None Объем:

container.Register<IDbConnection>(c => 
  c.Resolve<IDbConnectionFactory>().OpenDbConnection()
)
.ReusedWithin(ReuseScope.Request);
Другие вопросы по тегам