Шаблоны UnitOfWork + Repository и олицетворение Entity Framework

Я использовал шаблоны UnitOfWork и Repository в своем приложении с EF.

На самом деле мой дизайн предусматривает, что UnitOfWork создаст класс ObjectContext и внедрит его в конкретный класс Repository. Например:

UnitOfWork.cs (инициализация)

public DefaultUnitOfWork() {
    if (_context == null) {
        _context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
    }
}

UnitOfWork.cs (получение экземпляра репозитория)

public CustomerRepository Customers {
    get {
        if (_customers == null) {
            _customers = new CustomerRepository(_context);
        }
        return _customers;
    }
}

Таким образом, классы репозитория имеют уже определенный класс ObjectContext и могут использовать его методы для извлечения и обновления данных. Это хорошо работает.

Теперь мне нужно выполнить мои запросы, олицетворяющие идентификатор пула приложений, поэтому я решил обернуть код в конструкторе UnitOfWork внутри олицетворения.

К сожалению, это не работает, потому что ObjectContext затем передается конструктору репозитория и используется позже, когда клиент репозитория вызывает, например, FindAll().

Я убедился, что реальное подключение к базе данных осуществляется прямо перед выполнением запроса Entity Framework, а не точно тогда, когда я создаю сам ObjectContext.

Как я могу решить эту проблему?


person Lorenzo    schedule 30.11.2011    source источник


Ответы (1)


Вы можете использовать одну или несколько фабрик ObjectContext (для создания ObjectContexts), используя различные критерии создания, такие как строка подключения, например. Ваш UnitOfWork может использовать фабрику для получения своего контекста, как и репозиторий, но я думаю, что вы упустили смысл UnitOfWork, если он использует другой ObjectContext, чем ваш репозиторий.

UnitOfWork должен состоять из одной или нескольких операций, которые должны выполняться вместе, что может легко использовать несколько репозиториев. Если в репозиториях есть свои собственные ObjectContexts, отдельные от UnitOfWork, я не понимаю, как фиксация UnitOfWork достигнет своей цели.

Я думаю, что либо я полностью неверно истолковал ваш вопрос, либо вы упустили некоторые важные детали. Удачи!

person ctorx    schedule 05.02.2012