Как внедрить или подключить 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);