Реализация UnitOfWork

Мне удалось реализовать небольшую классную единицу работы для работы с фреймворком сущностей.

Я придумал ..

public class UnitOfWork : IUnitOfWork
    {
        private Database _database;
        private IDatabaseFactory _databaseFactory;

        private DbTransaction transaction;

        public UnitOfWork(IDatabaseFactory databaseFactory)
        {
            _databaseFactory = databaseFactory;
            _database = Database;

            transaction = _database.Database.Connection.BeginTransaction();
        }

        public Database Database
        {
            get { return _database ?? (_database = _databaseFactory.Get()); }
        }

        public void Dispose()
        {
            try
            {
                _database.SaveChanges();
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
            }
        }
    }

Я почти уверен, что сейчас все завидуют этой единице работы. (Шучу)

Но у меня есть небольшая проблема с дизайном на этом уровне обслуживания.

public class JournalService : IJournalService
    {
        IJournalRepository _journalRepository;

        public JournalService(IJournalRepository journalRepository)
        { 
            _journalRepository = journalRepository;
        }

        public void AjouterJournal(Journal j)
        {
           [B]using (IUnitOfWork uow = new UnitOfWork())[/B]
            {
                var journal = new Journal();
                journalRepository.AddJournal(journal);

            }
        }
    }

Проблема в том, что единице работы требуется внедрение базы данных, поэтому я не могу создать ее экземпляр. Я не могу предоставить единицу работы непосредственно на уровне сервиса, потому что это не имело бы смысла, поскольку единица работы должна быть одноразовой.

И поскольку я использую репозиторий для добавления своих материалов, нет необходимости в доступе к единице работы работают напрямую, сохранение будет происходить автоматически, когда оно все равно будет удалено.

Я мог бы внедрить IDatabaseFactory в свой уровень обслуживания, но идея состоит в том, чтобы не использовать его там. На самом деле уровень сервиса не должен об этом знать.

Как насчет фабрики UnitOfWork?

Есть идеи или предложения, как я могу это исправить?

Спасибо.

5
задан skaffman 5 February 2011 в 16:47
поделиться