Модели на 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;
    }
}

По този начин класовете Repository имат вече дефиниран клас ObjectContext и могат да използват неговите методи за извличане и актуализиране на данни. Това работи добре.

Сега трябва да изпълня заявките си, олицетворявайки идентичността на набора приложения, така че реших да обвия кода в конструктора на UnitOfWork в олицетворението.

За съжаление това не работи, защото ObjectContext след това се предава на конструктора на хранилището и се използва по-късно, когато клиент на хранилището извика, например, FindAll().

Имам опит, че истинската връзка с базата данни се прави точно преди извършване на заявката от Entity Framework, а не точно когато създавам самия ObjectContext.

Как мога да разреша този проблем?


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


Отговори (1)


Можете да използвате една или повече ObjectContext Factories (за създаване на ObjectContexts), като използвате различни критерии за създаване, като например низ за свързване. Вашият UnitOfWork може да използва фабрика, за да получи неговия контекст, както и хранилището, но мисля, че сте пропуснали смисъла на UnitOfWork, ако използва различен ObjectContext от вашето хранилище.

UnitOfWork трябва да се състои от една или повече операции, които трябва да бъдат изпълнени заедно, което може лесно да използва множество хранилища. Ако хранилищата имат свои собствени ObjectContexts, отделни от UnitOfWork, не виждам как ангажирането на UnitOfWork ще постигне целта си.

Мисля, че или напълно погрешно изтълкувах въпроса ви, или сте пропуснали някои уместни подробности. Късмет!

person ctorx    schedule 05.02.2012