让我们从我的Architech开始。我将尽可能地简化我的代码。如果我完全混在一起,请警告我。
IUnitOfWork
participant
UnitOfWork
public interface IUnitOfWork<T> : IDisposable
{
IEntityRepository<T> Repository { get; }
void Commit();
}
RepositoryBase
public class UnitOfWork<T> : IUnitOfWork<T>
{
private IDbConnection _Connection;
private IDbTransaction _Transaction;
public IRepository<T> Repository { get; private set; }
public UnitOfWork(IDbConnection Connection, IRepository<T> Repository)
{
_Connection = Connection;
this.Repository = Repository;
_Transaction = _Connection.BeginTransaction();
}
}
TestDAL
public abstract class RepositoryBase<T> : IRepository<T>
{
protected IDbTransaction Transaction;
protected IDbConnection Connection { get { return Transaction.Connection; } }
public RepositoryBase(IDbTransaction transaction)
{
Transaction = transaction;
}
}
TestService(BLL)
public class TestDAL : RepositoryBase<Test>, ITestDAL
{
public DpTestDAL(IDbTransaction transaction) : base(transaction) {}
}
以及我的autofac配置。
public class TestService : ITestService
{
private IUnitOfWork<Test> uow;
public TestService(IUnitOfWork<Test> unitOfWork)
{
uow = unitOfWork;
}
public List<Test> GetAll()
{
return uow.Repository.GetAll().ToList();
}
}
我是这种架构的新手,并尝试自己的事情。请告诉我是否有问题或完全错误。
我的问题是,我需要将IDbTransaction传递给数据访问类构造器。当我不注册IDbTransaction接口时,异常是“无法解析参数”,当我尝试在OracleTransaction中注册时,异常是“ OracleTransaction”没有公共构造函数。我在哪里混的?
答案 0 :(得分:1)
由于OracleTransaction没有公共构造函数,因此可以使用IDbConnection创建如下所示的对象,
builder.Register(c =>
{
var conn = c.Resolve<IDbConnection>();
return conn.BeginTransaction(IsolationLevel.ReadCommitted);
});
以上是如何为用例进行注册的示例。