Autofac - Регистрация для транзакции - PullRequest
0 голосов
/ 26 декабря 2018

Давайте начнем с моей архитектуры.Я постараюсь максимально упростить свой код.Если я полностью перепутал, пожалуйста, предупредите меня.

IUnitOfWork

public interface IUnitOfWork<T> : IDisposable
{
    IEntityRepository<T> Repository { get; }
    void Commit();
}

UnitOfWork

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

RepositoryBase

public abstract class RepositoryBase<T> : IRepository<T>
{
    protected IDbTransaction Transaction;
    protected IDbConnection Connection { get { return Transaction.Connection; } }

    public RepositoryBase(IDbTransaction transaction)
    {
        Transaction = transaction;
    }
}

TestDAL

public class TestDAL : RepositoryBase<Test>, ITestDAL
{
    public DpTestDAL(IDbTransaction transaction) : base(transaction) {}
}

TestService (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();
    }
}

И мои настройки авто-фака.

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» не имеет открытого конструктора.Где я перепутал?

1 Ответ

0 голосов
/ 26 декабря 2018

Поскольку у OracleTransaction нет открытого конструктора, вы можете использовать IDbConnection, чтобы создать его, как показано ниже,

builder.Register(c =>
{
     var conn = c.Resolve<IDbConnection>();
     return conn.BeginTransaction(IsolationLevel.ReadCommitted);
});

Выше приведен пример того, как вы можете зарегистрировать его для своего варианта использования.

...