Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как избежать дублирования кода в сервисном слое?

#c_sharp #entity_framework #инспекция_кода


public interface IOperationService
{
    IEnumerable GetItems(int operationId);
}

public class OperationService: IOperationService
{
    public IEnumerable GetItems(int operationId)
    {
        var items = getItems(operationId);
        //дальнейшие действия по преобразованию
        //OperationItem в OperationItemViewModel
    }
    private IEnumerable getItems(int operatonId)
    {
        return _context.Set().Where(x=>x.OperationId==OperationId)
               .Include(x=>x.File)
               .ToList();
    }
}


где


OperationItem - класс доменной модели;
OperationItemViewModel - вью модель


Весь этот код у меня находится в сервисном слое.

Мне потребовалост добавить новый сервис IAssemblyService в котором на текущий момент
будет только один метод: IEnumerable GetAssemblies(int operationId)
а проблема заключается в том что для этого мне необходимо получить список итемов входящих
в указанную операцию и для этого мне необходимо иметь доступ к методу getItems() из
OperationService. Хочется избежать дублирования и оставить интерфейс чистым. Подскажите
как лучше всего это реализовать?

UPD: можно попрбовать сделать так:

public IEnumerable GetAssemblies(int operationId)
{
    var items = (OperationService)_operationService).getItems(operationId);
    //дальнейшие действия
}


но я не уверен в правильности данного способа
    


Ответы

Ответ 1



Шаблон репозиторий вообще один из самых проблемых (раз, два, три...). Как у витязя на распутье у вас есть три пути: Вызывать из одного репозитория другой. Но это превратит код в паутину. Отнаследоваться. Это приведет к огромным God-object'ам. Поменять архитектуру приложения. На давно существующем проекте крайне рискованная операция. Как видите все варианты достаточно негативные: «Направо пойдёшь – коня потеряешь, себя спасёшь; налево пойдёшь – себя потеряешь, коня спасёшь; прямо пойдёшь – и себя и коня потеряешь». Пожалуй, я бы в итоге порекомендовал текущие приложения не менять -- но читать больше про архитектуры приложений. Domain Driven, Data Driven, CQRS. Сложно рекомендовать книги и статьи, не зная, что ваш текущий уровень, но попробую: http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html https://habrahabr.ru/post/313110/ https://habrahabr.ru/post/259829/ https://habrahabr.ru/post/158277/

Комментариев нет:

Отправить комментарий