我执行使用ServiceStack.ORMLite这样Repository模式:
public class MyRepository : IMyRepository
{
private IDbConnectionFactory DbConnectionFactory = null;
public MyRepository(IDbConnectionFactory dbConnectionFactory)
{
DbConnectionFactory = dbConnectionFactory;
}
public void MyMethod()
{
using (var connection = DbConnectionFactory.OpenDbConnection())
using (var cmd = connection.CreateCommand())
{
//Do something here
}
}
}
但我不知道如何处理DbTransaction当我需要一些扭曲DB操作在DbTransaction.It貌似TransactionScope
是一个解决方案,但我不知道是否是太沉重了这一点。
ServiceStack OrmLite ,您可以访问ADO.NET的原始IDbConnection
和IDbTransaction
你应该使用它来代替的TransactionScope的类。 您可以通过创建一个事务IDbConnection.OpenTransaction()
扩展方法,如:
public class MyRepository : IMyRepository, IDisposable
{
private IDbConnectionFactory DbFactory { get; set; }
private IDbConnection db;
private IDbConnection Db
{
get { return db ?? (db = dbFactory.Open()); }
}
public void WithTransactions()
{
using (var trans = Db.OpenTransaction())
{
//Do something here
trans.Commit();
}
}
public List<Poco> WithoutTransactions()
{
return Db.Select<Poco>();
}
public void Dispose()
{
if (db != null)
db.Dispose();
}
}
因为它需要较少的代码,我宁愿财产注射和使用懒惰Db
特性,以简化数据访问模式为我的方法。
注:每当任何类中保持一个开放的参考IDbConnection
(像这样),应该用无/瞬态或RequestScope所以连接被使用后丢弃(即不注册为单身)注册。
我喜欢这里mythz回答但遇到一些麻烦自己把事情如我所期望的基础上mythz反馈工作。 我碰到这个对方的回答是,在第一,似乎没有什么我一直在寻找,但真的结束了把我在正确的方向跑去。
使用ServiceStack.ORMLite执行工作的单位和存储库模式的最佳实践