Я думаю, що у вас може виникнути непридатність користувача до процесу невідповідності.
По-перше: чи чесно користувач захоче виконати кілька змін у файлі одночасно? Перейменування (яке може включати або не включати зміну шляху?), Зміну власності та, можливо, зміна вмісту файлу (заради аргументу) здаються окремими діями.
Давайте візьмемо випадок, коли відповідь "так" - ваші користувачі дійсно хочуть вносити ці зміни одночасно.
У цьому випадку, я настійно рекомендую проти будь-якої реалізації , яка посилає кілька подій - RenameFileCommand
, MoveFileCommand
, ChangeOwnerCommand
- для подання цього одного наміри користувача.
Чому? Тому що події можуть провалитися. Можливо, це вкрай рідко, але ваш користувач подав операцію, яка виглядала атомною - якщо жодна з подій у нижній частині потоку виходить з ладу, стан вашої програми тепер недійсний.
Ви також запрошуєте небезпеку для перегонів на ресурсі, який чітко ділиться між кожним з обробників подій. Вам потрібно буде написати "ChangeOwnerCommand" таким чином, щоб ім'я та шлях файлу не мали значення, оскільки вони могли застаріти до моменту отримання команди.
Реалізуючи несподівану систему спокою з переміщенням і перейменуванням файлів, я вважаю за краще забезпечити узгодженість, використовуючи щось на зразок системи eTag - переконайтесь, що версія редагованого ресурсу є версією, яку останній користувач отримав, і не вдасться, якщо вона був змінений з того часу. Але якщо ви відправляєте кілька команд для цієї операції з одним користувачем, вам потрібно буде збільшити версію ресурсу після кожної команди - так що у вас немає ніякого способу знати, що ресурс, який користувач редагує, справді є тією ж версією, що і ресурс, який вони останнім часом читали .
Що я маю на увазі під цим, - що, якщо хтось інший виконує іншу операцію над файлом майже в той же час. Ці 6 команд можуть скластись у будь-якому порядку. Якби у нас було лише 2 атомні команди, попередня команда могла б досягти успіху, а пізніша команда могла провалитися "ресурс був змінений з моменту останнього пошуку". Але від цього немає захисту, коли команди не є атомними, тому послідовність системи порушується.
Цікаво, що в REST є рух на щось подібне до архітектури, заснованої на подіях, під назвою "Відпочинок без PUT", рекомендованої в радіолокаційній програмі Thoughtworks, січень 2015 року . Тут є значно довший блог про відпочинок без путу .
По суті, ідея полягає в тому, що POST, PUT, DELETE та GET чудово підходять для невеликих додатків, але коли вам потрібно почати припускати, як трактування та публікація та видалення можуть бути інтерпретовані на іншому кінці, ви вводите з'єднання. (наприклад, "коли я вилучаю ресурс, пов’язаний з моїм банківським рахунком, рахунок повинен бути закритий") І запропонованим рішенням є лікування REST більш породним способом. тобто дозволяє POST наміру користувача як єдиний ресурс події.
Інший випадок простіший. Якщо ваші користувачі не хочуть робити всі ці операції одночасно, не дозволяйте їм. Розмістіть подію для кожного наміру користувача. Тепер ви можете використовувати версію етагів на своїх ресурсах.
Що стосується інших програм, які використовують зовсім інші API для ваших ресурсів. Це пахне неприємностями. Чи можете ви побудувати фасад старого API поверх свого RESTful API та вказати його на фасад? тобто відкрийте службу, яка виконує кілька оновлень файлу послідовно через сервер REST?
Якщо ви ні будуєте інтерфейс RESTful поверх старого рішення, ні будуєте фасад старого інтерфейсу поверх рішення REST і намагаєтесь підтримувати обидва API, що вказують на спільний ресурс даних, у вас виникнуть великі головні болі.