如何将ormlite注入或连接到ServiceStack存储库?

fra*_*tal 2 repository servicestack funq 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
    }
}
Run Code Online (Sandbox Code Playgroud)

服务基类已经允许使用'Db'对象通过ormlite直接访问数据库,因此:

public class Service : IService, IRequiresRequestContext, IServiceBase, IResolver, IDisposable
{
    public virtual IDbConnection Db { get; }
}
Run Code Online (Sandbox Code Playgroud)

让我相信我可以这样做,所以我可以在派生类中使用'Db':

public class BaseRepository: IDisposable
{
    public virtual IDbConnection Db { get; }
}
Run Code Online (Sandbox Code Playgroud)

我的AppHost中有这一行来传递连接字符串并注册存储库:

container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register(new TodoRepository());
Run Code Online (Sandbox Code Playgroud)

如何将IDbConnection注入或自动装载到BaseRepository类?我已经尝试在AppHost中注册并自动装配BaseRepository而没有运气.

myt*_*thz 5

请参阅IOC wiki文档中的Autowire注册部分.这只是注册一个单例实例,因为你传入一个现有实例,IOC无法控制该类型的创建:

container.Register(new TodoRepository());
Run Code Online (Sandbox Code Playgroud)

如果您希望自动连线,则需要使用其中一个自动连接的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));
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过指定工厂方法手动控制实例的创建:

container.Register(c => new TodoRepository { 
    DbFactory = c.Resolve<IDbConnectionFactory>() 
});
Run Code Online (Sandbox Code Playgroud)

如果你想注入一个IDbConnection而不是确保它在RequestNone范围:

container.Register<IDbConnection>(c => 
  c.Resolve<IDbConnectionFactory>().OpenDbConnection()
)
.ReusedWithin(ReuseScope.Request);
Run Code Online (Sandbox Code Playgroud)