вторник, 6 сентября 2011 г.

Использование выражений для устранения дублирования кода

Последнее время стал заниматься такой фигнёй для устранения дублирования. Да, возможно, это бред.

Что здесь происходит?
1. Из репозитория берётся метод, использующий постраничный вывод данных.
2. Этот метод передаётся в метод, который инкапсулирует логику работы со страницами.
3. Всё это оборачивается в using unit of work'а (uow = Unit of work), в котором создается Entity контекст.
4. Возвращается в дочернем экшене.
Это похоже на ASP.NET WebForms Control (.ascx)


[ChildActionOnly]
public PartialViewResult GetExclusiveVideo(int count, int page = 1)
{
       return InUow(() => PartialView(Paged(_videoItemRepository.ExclusiveVideos
                                            page, count)));
}

private TModel InUow<TModel>(Func<TModel> func)
{
       using (_unitOfWorkFactory.Create())
       {
             return func();
       }
}

private TModel InUow<TModel>(Func<IUnitOfWork, TModel> func)
{
       using (var uow = _unitOfWorkFactory.Create())
       {
             return func(uow);
       }
}
  
private IEnumerable<TModel> Paged<TModel>(Func<int, int, IEnumerable<TModel>> pagedMethod,                      
                                          int page, int count)
{
       var skip = (page - 1)*count;
       return pagedMethod(skip, count);
}

Красиво? Удобно? Неясно? Слишком обще? Есть ещё извращённые идеи?
Спасибо за внимание.