2012-06-12 2 views
3

Для проекта мне нужно изменить связь между сервером и клиентом.Хорошая инфраструктура синхронизации .Net для архитектуры n-уровня

На самом деле это служба WCF, размещенная в консольном приложении, которая отправляет клиенту весь контент таблицы, а клиент заменяет весь свой локальный кеш новым контентом.

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

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

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

Слой синхронизации имеет низкое сцепление, поэтому не так важно изменить способ его работы.

Моего требования проекта является:

  • Должен иметь добавочную синхронизацию
  • Может толкать изменения на сервер
  • информации Access/магазин форума
  • Возможности сделать полный пересинхронизироваться (испорченный кэш, или новый компьютер)
  • Поставщик данных со стороны сервера - Entity Framework
  • Мне нужно повторно использовать мой текущий пользовательская аутентификация
  • Бонус: некоторые типы имеют специальную синхронизацию (например, У меня есть база данных, содержащая небольшие файлы, но на стороне клиента файлы должны быть помещены непосредственно в папку)

Я немного посмотрел, чтобы увидеть, что существует.

Я нашел кое-что о Microsoft Sync Framework, но, похоже, он ориентирован на ADO.Net, и я не уверен, что он может принимать данные из службы сущностей и помещать их в сериализованный кэш.

Итак:

Можете ли вы посоветовать мне платформу или библиотеку, чтобы сделать эту работу? Или вы думаете, что в отношении моих потребностей я должен скорее реализовать это?

ответ

7

Я использовал Microsoft Sync Framework в прошлом для подобного многоуровневого иногда связано клиента, и она работала лакомство. Он перешел с тех пор, как я его последний раз использовал, но вот как я вижу, что он отвечает вашим требованиям.

WCF

прекрасно работает над WCF, это то, как мы использовали его. (How to: Configure N-Tier Synchronization)

Должен иметь добавочную синхронизацию

Sync Services делает это очень хорошо, но вы можете добавить метки к вашим таблицам синхронизации. Ваша клиентская база данных (которая в моем случае была базой данных SQL Server CE) содержит последнюю временную метку, которая была использована, когда вы в последний раз синхронизировались, и затем будет использовать это, чтобы получить все, что было изменено впоследствии во время следующей синхронизации.

Может толкать изменения на сервер

Опять мы сделали это. Существует много крючков для предоставления пользовательской логики на сервере для проверки данных.

Access/магазин информация отсутствует

прекрасно работает в полностью отключенном сценарии (при условии, что пользователь имеет уже первый синхронизируются свои данные). См. Offline Scenarios.

Возможность сделать полный пересинхронизироваться (поврежден кэш, или новый компьютер)

Это является клиентская база данных, которая содержит все информации о синхронизации (вы можете поместить знания на сервер о том, что клиент синхронизируется, если вы хотите). Если вы удалите локальную базу данных, клиент выполнит полную синхронизацию.

Поставщик данных на стороне сервера является Entity Framework

Это не так, как я использовал его, но синхронизации поставщиков, полностью настраиваемый. Мы собирались посмотреть на NHibernate, но спросите себя, почему вы хотите это сделать. Вне коробки Службы синхронизации позволят вам удалять и извлекать данные с помощью хранимых процедур или прямых запросов к таблице. Это очень просто настроить, и поскольку вы можете использовать множество данных, они очень быстро запускаются, и данные просты для синхронизации по границе WCF (хотя для повышения производительности мы перешли к бинарному форматированию из форматирования xml).

То, что мы нашли, было только потому, что мы использовали Сущности на сервере, они не обязательно имели смысл на клиенте, и поэтому у нас был целый новый набор сущностей на клиенте. Это также означало, что мы удаляли данные, которые не были нужны клиенту в хранимых процедурах. Снова это было очень легко, и вам не нужно пачкаться с ADO.net. Затем, как только данные находятся на клиенте, мы использовали NHibernate для чтения и записи в локальную базу данных.

Building Custom Sync Providers for the Microsoft Sync Framework

Мне нужно повторно использовать мою текущую пользовательскую проверку подлинности

Если вы имеете в виду пользовательскую проверки подлинности WCF, то да, как у нас были наш собственного WCF пользовательского маркера безопасности, который работал хорошо без каких-либо последствий.

Бонус: Некоторые типы имеют специальную синхронизацию (например, я базу данных, содержащую небольшие файлы, но на стороне клиента, файлы должны находиться непосредственно в папке)

Короткий ответ я не знаете, поскольку они являются поставщиками синхронизации файлов в новой структуре, которые я не использовал, но у вас есть еще два варианта.

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

  2. Исключить файлы двоичных данных из синхронизации и вывести эти данные после синхронизации с помощью другого процесса. Мы сделали это, поскольку пакеты, которые мы снимали, были довольно большими, поэтому мы использовали начальную синхронизацию, чтобы вытащить «метаданные», а затем мы использовали что-то под названием BITS, которое является частью окон, чтобы анимировать файлы.

Introduction to Microsoft Sync Framework File Synchronization Provider

[UPDATE]

В ответ на вопросы, заданные в комментариях.

  1. Мое приложение должно работать для разных пользователей на одном компьютере. В моем случае я использовал изолированное хранилище, чтобы гарантировать, что они работают в другом месте, возможно ли это с помощью SQL Server CE?

    Наше приложение было развернуто через ClickOnce, которое обеспечило бы отдельную установку приложения для каждого пользователя, но я не думаю, что это то, что задают. SQL CE - это просто база данных в памяти, вы указываете SqlCeEngine в файле базы данных, который хотите загрузить, поэтому изолированное хранилище идеально подходит.

  2. Насколько я знаю, SQL Server CE похож на SQLite, как вы управляете созданием схемы?

    Вы можете позволить Snyc Services создать схему базы данных для вас, если хотите, и это будет достаточно хорошо для вас, но в конечном итоге вам, вероятно, придется изменить схему в какой-то момент. Вероятно, это произойдет, когда вы сделаете обновление, поэтому вам лучше подумать об этом на ранней стадии. Я имел в виду это, не думая о том, что база данных относится к службам синхронизации, но, как говорят, служба синхронизации сообщает, что она может использовать.

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

  3. Знаете ли вы, есть ли где-то пример реализации класса для этой N-уровневой синхронизации? Мне нужно увидеть, какие интерфейсы я должен реализовать.

    Текущий стабильный релиз - 2.1, и я использовал его так же, как 2.0 вышел, так что вся моя работа была в 1.0. Вот ссылка на api Microsoft Sync Framework 2.1 на MSDN. Мне пришлось использовать документы 1.0, чтобы найти примеры, которые я использовал для извлечения нашего интерфейса WCF, поэтому я не знаю, как далеко изменились вещи, но вы можете использовать this, чтобы начать с того, что определяет интерфейс следующим образом:

    [ServiceContract] Открытый интерфейс IServiceForSync { [OperationContract()] SyncContext ApplyChanges (SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession);

    [OperationContract()] 
    SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession); 
    
    [OperationContract()] 
    SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession); 
    
    [OperationContract()] 
    SyncServerInfo GetServerInfo(SyncSession syncSession); 
    

    }

  4. Я полагаю, что это одна услуга для каждого типа данных?

Нет, как вы можете видеть сверху, есть только одна услуга. То, что синхронизировано, зависит от того, что вы показываете на сервере, и от того, что клиент хочет участвовать. Например, у нас было два клиента, нас интересовал только небольшой подмножество данных и участвовал только в синхронизации нескольких таблиц (называемых a SyncTable), где другая синхронизировала все таблицы.

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

  1. Могу ли я синхронизировать только данные относительно пользователя?

Абсолютно. Когда вы выполняете синхронизацию, вы передаете SyncParameter, который содержит значения, которые вы можете использовать для фильтрации возвращаемых данных клиенту. How to: Filter Rows and Columns.

+0

Ваше предложение кажется довольно интересным, у меня есть несколько вопросов: 1. Мое приложение должно работать для разных пользователей на одном компьютере. В моем случае я использовал изолированное хранилище, чтобы гарантировать, что они работают в другом месте, возможно ли это с помощью SQL CE? 2. Насколько известно, SQL CE похож на SQLite, как вы управляете созданием схемы? 3. Знаете ли вы, есть ли где-то пример реализации класса для этой N-уровневой синхронизации? Мне нужно увидеть, какие интерфейсы я должен реализовать. 4. Я полагаю, это одна услуга на каждый тип данных? 5. Могу ли я синхронизировать только данные относительно пользователя? – J4N

+0

@ J4N Я обновил ответ, чтобы заняться дополнительными очками, которые вы подняли. – Bronumski

+0

Я пытаюсь реализовать ваше решение, у меня есть один вопрос: как вы управляете удалением? Если элемент удален, откуда вы знаете, что когда клиент вызывает операции GetChanges? Сохраняли ли вы все данные в базе данных, помеченные как удаленные?Или у вас есть таблица, содержащая все идентификаторы удаленных элементов? – J4N

0

В зависимости от того, как вы можете или готовы развернуть и выставить на сервер можно использовать SQL Server Replication

репликации может заботиться о всех утомительных replication tasks в то время как вы беспокоитесь о приложении.

Возможно, вы захотите установить SQL Express и использовать репликацию слиянием.

EDIT Using parameterized filters управлять тем, что данные будут скопированы и installing SQL Express as a prerequisite using a bootstrapper.По-видимому, Microsoft не предоставила загрузчик для SQL Express here is a discussion on a that

+0

Я уже думал об этом. Но пользователи имеют доступ только к частичной копии базы данных (и мне нужно, чтобы все на клиенте было установлено через ONE-настройку). – J4N

+0

Установка SQL Express может быть выполнена путем добавления ее в качестве предварительной установки для установки вашего приложения. Насколько я знаю, вы можете указать фильтры, чтобы определить, какие данные будут нажаты. –

+0

Хм, это начинает быть интересным. Итак, вы говорите мне, что установка и настройка SQL Express можно выполнить в настройке? И для фильтра у меня есть некоторые сомнения, что я могу установить их в зависимости от текущего пользователя. – J4N