In the previous blog postings, I explained the features that the infrastructure provides, and how to experiment with the test application.
In this post, I will show how to use this infrastructure in your own project.
In case you don't want to use NuGet, you should jump to the next section: "Add assemblies references manually".
Install using NuGet
I assume that you are already familiar with NuGet, if not, you can read more about it here.
- Add Library Package reference:
- Search and install the
P2PSync package (by typing P2P in the search box):
- After the package is installed, you should see the infrastructure assemblies in your project. The dependencies (NLog), and your app.config file contains the new sections.
The added assemblies (dependencies for NLog):
Those assemblies that are for supporting logging, I use the
Log2Console. You can download it here from Codeplex.
And the main infrastructure assemblies:
Add Assemblies References Manually
In case you don't want to use NuGet, you should download the latest version from the Codeplex project site.
After extracting the file, add the following assemblies to your project:
Download from NLog and add the following assemblies:
Implement Your Own Business Logic Classes
Implement own business logic synchronization class – inherit from
Roniz.WCF.P2P.Sync.Interfaces.ISynchronizationBusinessLogic (In the example application, this is the
Roniz.WCF.P2P.ApplicationTester.MySynchronizationBusinessLogic class.) Should override the following methods:
ProvideFullPresenceInfo – Can return any class that derived from
null if decided not to send anything to the other peers when your peer goes online.
OnOnlineAnnouncementReceived – This method calls on the other peers when they receive an announcement from the peer that comes online, the method received the derived implementation of the prior
ProvideCompactPresenceInfo – Can return any class that derived from
null if decided not to send anything to the other peers before your peer goes down (called on
OnOfflineAnnouncementReceived - This method calls on the other peers when they receive an announcement from the peer that goes offline, the method receives the derived implementation of the prior
OnPresenceInfoChangedReceived - This method calls on the other peers when they receive an announcement from the peer that changed his presence information. For example, if the peer listens on some IP address for messages from other peers, and notifies this information via
ProvideFullPresenceInfo(), and then the peer IP address changed, it can send this information to the other peers and they will receive it via this method.
ProvideSynchronizationResponse – Calls to provide response to prior request of other peer for peer own synchronization details. Usually, the peer will respond some compact response about its own data, not the full detailed data to reduce unneeded data between peers.
For example: If the data is organized in some dictionary, it will respond its keys and not the values – let the requested peer filter the keys that he doesn't have yet and receive the full data from them at a later time.
ProvideSynchronizationDetailRequest – Calls on the peer that initiates the synchronization after they receive the response via
ProvideSynchronizationResponse, and lets them request specific details for the synchronization.
ProvideSynchronizationDetailResponse – Calls on the other peers to allow them to respond to the full synchronization detail.
ProvideFullSynchronizationDetailResponse - Calls on the other peers to allow them to respond the full synchronization detail that is not filtered by some key information, like in
OnSynchronizationDetailsResponseReceived - Calls on the peer that initiates the synchronization after receiving the response via Full or partial synchronization.
OnUpdateReceived – Calls on peers that receive the
Update message from another peer.
[Optional] can also override the
OnCommunicationStateChanged method to take action when the communication state changes.
There is also a property named
IsNeedFullSynchronization that is set automatically by the infrastructure to let it determine if the peer that initiated the synchronization process needs full or partial synchronization. However, the developer can set this property. For example, if he thinks that under some conditions, he needs full synchronization.
FullPresenceInfo – The class that contains the data that will be sent from the peer that comes online to the rest of the mesh peers. (In the example application, this is the
CompactPresenceInfo – [optional] The class that contains the data that will be sent from the peer that goes offline to the rest of the mesh peers.
(In the example application, this is the
BusinessLogicMessageBase – This class is used as the base class for all synchronization messages.
Code (Code Examples Taken from the Test Application)
- Initiate the synchronization manager:
SynchronizationStateManager and provide it your own business logic instance:
SyncManager = new SynchronizationStateManager(MySynchronizationBusinessLogic);
And when you want to start the synchronization:
- Update other peers with changes:
Optional call update on the
SyncManager when it’s necessary by your application specific logic:
var updateState = new MyStateContainer
StateDictionary = new Dictionary<Guid, MyUserUpdateState>(1)
- Close the synchronization manager: This line will send notification to the other peers that the current peer is going down – and they can react to this message in their business logic layer.
Edit the app.config File
In case you use the NuGet to install the package, the app.config file is merged and already contains the following sections. If you didn't install via NuGet, you should add those sections manually by yourself.