Начальная нота:
_unitOfWork.Respository<IUserRepository>()…
Как таковой, вы, по сути, «злоупотребляете» UnityOfWork
в качестве локатора службы (вы можете запросить у него любой тип хранилища), но, похоже, он не дает никаких дополнительных преимуществ , Это действительно то, что вы хотите? Не могли бы вы просто отказаться от UnitOfWork
и вместо этого сделать следующее:
_unityContainer.Resolve<IUserRepository>()…
Альтернативное решение, не требующее параметра второго типа:
Я согласен с @Jon Egerton, что для правильной работы одной из них можно было бы ввести второй параметр универсального типа (TItem
рядом с TItemRepository
). Однако существует другое решение, включающее интерфейс маркера IRepository
:
// non-generic marker interface (empty)
public interface IRepository {}
public interface IRepository<T> : IRepository { … /* as before */ }
// ^^^^^^^^^^^^^
// added
public class UnitOfWork
{
public TRepository Get<TRepository>() where TRepository : IRepository
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// this way, no 2nd type parameter is
// needed since the marker interface is
// non-generic.
{
return new UnityContainer().Resolve<TRespository>();
}
}
По запросу: Пример единицы работы:
Если вы будете следовать определению Мартина Фаулера для модели единиц работы , вы получите нечто весьма отличное от того, что есть у вас сейчас. Скорее, единица работы в соответствии с его превосходством просто отслеживает все изменения, которые были внесены в коллекцию объектов. Идея, лежащая в основе этого, состоит в том, что изменения не сохраняются (например, в базе данных) по одному, а все одновременно, когда запрашивается через объект единицы работы; таким образом, имя шаблона:
class UnitOfWork<T>
{
// the UnitOfWork object tracks changes to objects of type T:
private HashSet<T> newItems;
private HashSet<T> modifiedItems;
private HashSet<T> removedItems;
public void Commit()
{
// let's say items are persisted to an RDBMS, then:
// * generate 'DELETE FROM [tableForItemsOfTypeT]' statements
// for all items in the 'removedItems' set;
// * generate 'INSERT INTO [tableForItemsOfTypeT]' statements
// for all items in the 'newItems' set;
// * generate 'UPDATE [tableForItemsOfTypeT]' statements
// for all items in the 'modifiedItems' set.
}
}