c# - Autofac - 注册交易
问题描述
让我们从我的架构开始。我会尽量简化我的代码。如果我完全混淆了,请警告我。
工作单位
public interface IUnitOfWork<T> : IDisposable
{
IEntityRepository<T> Repository { get; }
void Commit();
}
工作单位
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();
}
}
存储库库
public abstract class RepositoryBase<T> : IRepository<T>
{
protected IDbTransaction Transaction;
protected IDbConnection Connection { get { return Transaction.Connection; } }
public RepositoryBase(IDbTransaction transaction)
{
Transaction = transaction;
}
}
测试DAL
public class TestDAL : RepositoryBase<Test>, ITestDAL
{
public DpTestDAL(IDbTransaction transaction) : base(transaction) {}
}
测试服务 (BLL)
public class TestService : ITestService
{
private IUnitOfWork<Test> uow;
public TestService(IUnitOfWork<Test> unitOfWork)
{
uow = unitOfWork;
}
public List<Test> GetAll()
{
return uow.Repository.GetAll().ToList();
}
}
还有我的 autofac 配置。
builder.RegisterType<TestService>().As<ITestService>();
builder.RegisterType(typeof(OracleConnection)).As(typeof(IDbConnection)).InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(RepositoryBase<>)).As(typeof(IRepository<>)).InstancePerLifetimeScope();
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency();
//builder.RegisterType(typeof(OracleTransaction)).As(typeof(IDbTransaction)).InstancePerLifetimeScope();
我是这种建筑师的新手,并尝试做一些我自己的事情。请告诉我是否有问题或完全错误。
我的问题是,我需要将 IDbTransaction 传递给数据访问类的构造函数。当我没有注册 IDbTransaction 接口时,异常是“无法解析参数”,当我尝试注册 OracleTransaction 时,异常是“OracleTransaction”没有公共构造函数。我混到哪里去了?
解决方案
由于 OracleTransaction 没有公共构造函数,您可以使用 IDbConnection 创建如下所示的构造函数,
builder.Register(c =>
{
var conn = c.Resolve<IDbConnection>();
return conn.BeginTransaction(IsolationLevel.ReadCommitted);
});
以上是如何为您的用例注册它的示例。
推荐阅读
- javascript - 猫鼬中的参考是什么意思?
- r - 将白色背景添加到 plot.xts() 图例 [R]
- azure - Azure Kubernetes Service 将 docker root 更改为 /mnt(/dev/sdb1 临时存储)
- javascript - 如何将库添加到 webpacker 以在 Stimulus JS 控制器中使用
- php - 在 HTML 页面中使用 PHP 创建指向另一个页面或目录的操作链接
- laravel - Laravel - 如何根据数据库值创建一个带有特定条目的下拉列表
- unity3d - Unity Animator.Play 如何同时过渡到另一个动画
- javascript - 跨 chrome 和 firefox 获取 URL 中断
- c++ - 动态变量和未定义内存之间的 C++ 差异
- android - Flutter 没有找到预装的 Android SDK