2013-07-01 54 views
2

我想從一個存儲庫,而不是服務類訪問數據庫(增加制衡 - 不知道這是矯枉過正壽),即如何在ServiceStack存儲庫注入or連接ormlite?

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類?我已經嘗試在AppHost中註冊和自動裝載BaseRepository,但沒有運氣。

回答

5

請參閱IOC維基文檔中的Autowire registration部分。 這只是註冊了一個單件實例,因爲你正在傳遞一個現有實例,國際奧委會不能夠控制類型的創建:

container.Register(new TodoRepository()); 

如果你想讓它自動有線,你需要使用一個

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

如果要注入:

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)); 

或者您也可以通過指定工廠方法手動控制實例的創建:自動連線的API一個IDbConnection代替確保它在RequestNone範圍:

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