private FabricReplicator CreateFabricReplicatorHelper(IStateProvider stateProvider, ReplicatorSettings replicatorSettings)
        {
            Requires.Argument <IStateProvider>("stateProvider", stateProvider).NotNull();

            // Initialize replicator
            if (replicatorSettings == null)
            {
                AppTrace.TraceSource.WriteNoise("StatefulPartition.CreateFabricReplicator", "Using default replicator settings");
            }
            else
            {
                AppTrace.TraceSource.WriteNoise("StatefulPartition.CreateFabricReplicator", "{0}", replicatorSettings);
            }

            NativeRuntime.IFabricReplicator      nativeReplicator;
            NativeRuntime.IFabricStateReplicator nativeStateReplicator;

            StateProviderBroker stateProviderBroker = StatefulServicePartition.CreateStateProviderBroker(stateProvider);

            using (var pin = new PinCollection())
            {
                unsafe
                {
                    if (replicatorSettings == null)
                    {
                        nativeStateReplicator = this.nativePartition.CreateReplicator(stateProviderBroker, IntPtr.Zero, out nativeReplicator);
                    }
                    else
                    {
                        IntPtr nativeReplicatorSettings = replicatorSettings.ToNative(pin);
                        nativeStateReplicator = this.nativePartition.CreateReplicator(stateProviderBroker, nativeReplicatorSettings, out nativeReplicator);
                    }
                }
            }

            NativeRuntime.IOperationDataFactory nativeOperationDataFactory = (NativeRuntime.IOperationDataFactory)nativeStateReplicator;
            if (nativeStateReplicator == null || nativeReplicator == null || nativeOperationDataFactory == null)
            {
                AppTrace.TraceSource.WriteError("StatefulPartition.Create", "Native replicators could not be initialized.");
                throw new InvalidOperationException(StringResources.Error_StatefulServicePartition_Native_Replicator_Init_Failed);
            }

            stateProviderBroker.OperationDataFactory = new OperationDataFactoryWrapper(nativeOperationDataFactory);

            return(new FabricReplicator(nativeReplicator, nativeStateReplicator, nativeOperationDataFactory));
        }
        private static StateProviderBroker CreateStateProviderBroker(IStateProvider stateProvider)
        {
            AppTrace.TraceSource.WriteNoise("StatefulPartition.CreateStateProviderBroker", "Creating broker for {0}", stateProvider);

            StateProviderBroker stateProviderBroker;

            IAtomicGroupStateProvider atomicGroupStateProvider = stateProvider as IAtomicGroupStateProvider;

            if (atomicGroupStateProvider != null)
            {
                AppTrace.TraceSource.WriteNoise("StatefulPartition.CreateStateProviderBroker", "StateProvider is IFabricAtomicGroupStateProvider");
                stateProviderBroker = new AtomicGroupStateProviderBroker(stateProvider, atomicGroupStateProvider);
            }
            else
            {
                stateProviderBroker = new StateProviderBroker(stateProvider);
            }

            return(stateProviderBroker);
        }