我正在使用ServiceStack.ORMLite实现Repository Pattern,如下所示:
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中扭曲一些数据库操作时,我不知道如何处理DbTransaction。看起来TransactionScope
是一个解决方案,但我不知道这是否太重了。
答案 0 :(得分:10)
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();
}
}
由于它需要更少的代码,我更喜欢属性注入,并使用Lazy Db
属性来简化我的方法的数据访问模式。
注意:每当您的任何课程引用开放式IDbConnection
(如此)时,应使用无/瞬态或 RequestScope 因此连接在使用后被丢弃(即不将其注册为单例)。
答案 1 :(得分:0)
我喜欢这里的mythz答案,但是根据mythz的反馈意见,我自己也会遇到一些麻烦。我碰到了另一个答案,起初,似乎不是我想要的,但真的最终让我朝着正确的方向前进。
Best practices of implementing unit of work and repository pattern using ServiceStack.ORMLite