Должен ли я вызывать AppService из другого AppService?

контекст

В настоящее время я работаю в системе управления документами и записями (DRMS?). Из-за некоторых технических ограничений мне нужно хранить файл "view" и файл "source" (DOCX или XLSX). Файл представления - это файл PDF, который пользователи могут распечатывать, загружать и просматривать каждый день, а исходный файл - это редактируемый файл. Когда пользователям требуется обновить файл, они загружают исходный код, обновляют его и загружают новый файл представления и соответствующий исходный файл.

В настоящее время я не могу реализовать средства просмотра / редактирования XLSX и из-за количества файлов не могу перейти на ODF, чтобы использовать доступные средства просмотра с открытым исходным кодом.

Прямо сейчас у меня есть две модели как это:

public class Document {
    //Other fields
    public virtual List<DigitalFile> Files { get; set; }
}

public class DigitalFile {
    //Other fields
    public virtual Document FileOf { get; set; }
}

Document модель имеет все "деловые" данные, в то время как DigitalFile Модель содержит данные о самих файлах (путь, URL, тип и т. д.)

Каждый раз, когда документ создается, у него будет 1 файл просмотра (обязательно), и он может иметь 1 исходный файл (некоторые документы могут быть недоступны для редактирования). Из этого вы можете знать, что при создании / обновлении документа будет создан / обновлен как минимум 1 цифровой файл.

Проблема / Вопрос

У меня будет DocumentAppService для обработки всех операций CRUD, но вот где мое сомнение приходит, должен ли я вызывать AppService из другого AppService? Я имею в виду, когда документ создается, должен ли метод Create вызывать другой метод Create в DigitalFileAppService? Или это должно быть лучше, если DocumentAppService справились все самостоятельно?

Прямо сейчас все операции CRUD в DigitalFile связаны с операциями в Document, поэтому я сомневаюсь в реализации AppService для файлов.

4 ответа

Решение

Я не предлагаю вызывать службу приложений из другой службы в том же домене. Сервисы приложений предназначены для вызова из уровня пользовательского интерфейса. Он реализует ведение журнала аудита, авторизацию, проверку... и они, вероятно, не понадобятся, если вы используете код на том же уровне приложения.

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

Мое предложение состоит в том, чтобы разделить общий код на другой класс (вероятно, службу домена) и использовать обе службы приложений.

В идеале, AppService не должен вызывать другой AppService.

Прикладная служба должна отображать объекты передачи данных (DTO) в доменные объекты (сущности), применять логику приложения и передавать их соответствующим диспетчерам доменов для сохранения.

Вполне нормально вводить несколько менеджеров, особенно если сопоставления настроены правильно. Там, где это возможно, служба приложений не должна зависеть от другой службы приложений.


Реально, сервис приложений может обеспечить удобство (и скорость из-за меньшего количества обращений к серверу), принимая вложенные "вторичные" DTO. Эти DTO могут включать отдельную логику приложения.

Один из способов сделать это чисто, это создать internal методы в службе приложений зависимостей, например CreateInternal для Create метод. internal методы не преобразуются в методы динамического веб-API и позволяют избежать затрат на авторизацию и проверку перехватчиками.

Кроме того, структура ABP предлагает [RemoteService(IsEnabled = false)] атрибут, если вы хотите вызывать эти методы непосредственно из контроллера MVC - поэтому методы должны быть открытыми.

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

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

Другие вопросы по тегам