Приложение Windows Forms в C# для онлайн / автономного обновления данных

Привет.

Я работал над проектом, который будет использовать API REST, расположенный на сервере, например, www.this-server.com, и будет приложение Windows Forms, использующее C#, назовем это приложение X.

Этот X будет установлен на нескольких машинах в разных точках земного шара, и они будут использовать приложение. Предположим, что есть 90 станций или машин, на которых установлен X, но Интернет подключен только к 85 станциям.

Я хочу, чтобы оставшиеся 5 станций не перестали работать, я имею в виду, что операции CRUD происходят в автономном режиме в локальной базе данных приложения X.

Как только станет доступной сеть, 5 оставшихся станций должны синхронизировать свои изменения с основным API на www.this-server.com и получать любые изменения, происходящие на сервере.

Я знаю, что для этого потребуется нечто вроде этого, так называемый умный клиент: https://www.codeproject.com/Articles/1134703/Net-application-that-works-online-and-offline-Sma

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

Что-то вроде этого: https://dba.stackexchange.com/questions/104700/sync-many-client-database-to-one-central-database

Я имею в виду, что это даже возможно, это могло бы быть возможно, если бы приложение X одновременно запускало один экземпляр, но в моем случае было 90 одновременных применений API.

Любая помощь, учения, советы будут высоко оценены. С уважением Jayant

PS: я начинающий разработчик и все еще учусь, поэтому много чего можно посмотреть и не сердиться на меня:-D.

2 ответа

Вы полностью привязаны к использованию REST?

Я предполагаю, что вы используете это в качестве транспортного механизма для отправки данных с X на сервер. Если X не имеет подключения к серверу, то сохранение локальной копии любых внесенных изменений будет действительно громоздким.

Вы можете рассмотреть возможность использования другого транспортного механизма, такого как MSMQ. Похоже, что это лучше подходит для приложений такого типа, поскольку MSMQ будет хранить сообщение локально до тех пор, пока не сможет подключиться к удаленной системе. Если есть связь, то сообщение может быть отправлено немедленно. так же, как если бы вы делали вызов REST. MSMQ может даже быть настроен на отправку через порты HTTP, если это является требованием. Возможно, вы могли бы использовать подход использования REST для получения данных с сервера и использования чего-то вроде MSMQ для отправки данных на сервер.

Если вы не можете изменить сервер, вам придется написать клиента (X), который может отличаться для синхронизированных записей и не синхронизированных записей.
Я бы либо создал второе хранилище для несинхронизированного материала, либо создал бы дополнительные поля, помечающие запись как несинхронизированную. При подключении я бы сделал что-то волшебное, чтобы обновить локальный идентификатор. Локальный идентификатор не может быть автоинкрементным.

Предпочтительно, если вы можете изменить сервер, я бы предпочел не использовать автоинкремент в REST API. Вместо этого я бы использовал Guid, который может быть создан кем-то глобально уникальным.
По соображениям производительности вы можете использовать целочисленный идентификатор автоинкремента локально. Но для любого взаимодействия с внешней системой скрыть идентификатор и использовать вместо этого Guid.

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