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

时间:2013-07-01 09:59:29

标签: repository servicestack ormlite-servicestack funq

我想从存储库而不是服务类访问数据库(为了增加分离 - 不确定这是否有点过分),即

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而没有运气。

1 个答案:

答案 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,请确保它位于RequestNone范围:

container.Register<IDbConnection>(c => 
  c.Resolve<IDbConnectionFactory>().OpenDbConnection()
)
.ReusedWithin(ReuseScope.Request);