我想从存储库而不是服务类访问数据库(为了增加分离 - 不确定这是否有点过分),即
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
}
}
服务基类已经允许使用'Db'对象通过ormlite直接访问数据库,因此:
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类?我已经尝试在AppHost中注册并自动装配BaseRepository而没有运气。
答案 0 :(得分:5)
请参阅IOC维基文档中的Autowire registration部分。 这只是注册一个单例实例,因为你传入一个现有实例,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);