Я пытаюсь использовать единицу работы и хранилище в своем проекте. Который тогда заставлял меня думать о том, как реализовать транзакцию с ним.Использование единицы работы и репозитория
На данный момент это то, что я планирую сделать:
public class UnitOfWork : IUnitOfWork
{
private readonly IDbFactory databaseFactory;
private adminBoContext dataContext;
private DbContextTransaction _transaction;
private Repository<a> repoA;
....
private Repository<x> repoX;
public UnitOfWork(IDbFactory databaseFactory)
{
this.databaseFactory = databaseFactory;
_transaction = dataContext.Database.BeginTransaction();
}
protected Context DataContext
{
get { return dataContext ?? (dataContext = databaseFactory.Get()); }
}
public void Commit()
{
try
{
_transaction.Commit();
}
catch (Exception ex)
{
_transaction.Rollback();
}
}
}
но потом я наткнулся, например, такие, как SocialGoal project где она имеет Единица работы (но без хранилищ внутри него) и отдельных хранилищ, похоже, имеет свой собственный экземпляр контекста
public class UnitOfWork : IUnitOfWork
{
private readonly IDatabaseFactory databaseFactory;
private SocialGoalEntities dataContext;
public UnitOfWork(IDatabaseFactory databaseFactory)
{
this.databaseFactory = databaseFactory;
}
protected SocialGoalEntities DataContext
{
get { return dataContext ?? (dataContext = databaseFactory.Get()); }
}
public void Commit()
{
DataContext.Commit();
}
}
public abstract class RepositoryBase<T> where T : class
{
private SocialGoalEntities dataContext;
private readonly IDbSet<T> dbset;
protected RepositoryBase(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = DataContext.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
protected SocialGoalEntities DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Add(T entity)
{
dbset.Add(entity);
}
Я действительно путают теперь в том, как на самом деле единицы работы и хранилища должны быть реализованы, потому что, как я понимаю, что единица работы будет вид главных ворот КН ich будет проходить весь доступ к хранилищам.
Я был бы очень признателен, если бы кто-то мог пролить свет на эту единицу работы и реализацию хранилища.
Большое вам спасибо.
Ознакомьтесь с моим обновленным сообщением. Лично мне не нравится передавать всю единицу работы в репозиторий, мы должны передать «только то, что необходимо», которое является DataContext. Надеюсь, поможет. –
Thanks Khanh, Я редактирую свой код выше, передавая непосредственно контекст в репозиторий, а также добавляю для него метод сохранения. – hollycrab
вы не должны вызывать сохранение внутри репозитория, пусть это сделает блок работы. Вот почему это называется единицей работы (даже эта единица работы имеет только 1 операцию) –