/// <summary> /// Creates new instance of Workspace type /// </summary> internal Workspace(Guid snapshotId, TimeSpan timeout, INodeProvider <Guid, object, EdgeData> nodeProvider, IWorkspaceFacade commitTarget, ProxyCreatorService proxyCreatorService, TypesService typesService, IsolationLevel isolationLevel, IProxyMap immutableProxyMap) { this.workspaceId = Guid.NewGuid(); this.thread = Thread.CurrentThread; if (!typeof(TDataType).IsInterface) { throw new ArgumentException("Interface type expected: " + typeof(TDataType).AssemblyQualifiedName); } this.snapshotId = snapshotId; this.nodeProvider = nodeProvider; this.proxyCreatorService = proxyCreatorService; this.typesService = typesService; this.isolationLevel = isolationLevel; this.workspaceFacade = commitTarget; this.immutableProxyMap = immutableProxyMap; workspaceFacade.OpenWorkspace(workspaceId, snapshotId, isolationLevel, timeout); if (isolationLevel == IsolationLevel.ReadOnly) { // Rely directly on parent provider if read only this.objectInstancesService = new ObjectInstancesService(nodeProvider, typesService); this.immutableInstancesService = new ObjectInstancesService(nodeProvider, typesService); this.collectionInstancesService = new CollectionInstancesService(nodeProvider, typesService); this.dictionaryInstancesService = new DictionaryInstancesService(nodeProvider, typesService); } else { // Construct isolated provider for local changes var isolatedStorage = new DirectNodeProviderUnsafe <Guid, object, EdgeData>(new MemoryStorageUnsafe <Guid, object>(), false); isolatedProvider = new IsolatedNodeProvider(nodeProvider, isolatedStorage, thread); this.objectInstancesService = new ObjectInstancesService(isolatedProvider, typesService); this.immutableInstancesService = new ObjectInstancesService(nodeProvider, typesService); this.collectionInstancesService = new CollectionInstancesService(isolatedProvider, typesService); this.dictionaryInstancesService = new DictionaryInstancesService(isolatedProvider, typesService); } this.runtimeProxyFacade = new RuntimeProxyFacade(typesService, objectInstancesService, immutableInstancesService, collectionInstancesService, new CollectionInstancesService(nodeProvider, typesService), dictionaryInstancesService, new DictionaryInstancesService(nodeProvider, typesService), mutableProxyMap, immutableProxyMap, proxyCreatorService); // Initialize root data proxy var rootObjectId = commitTarget.GetRootObjectId(snapshotId); rootProxy = proxyCreatorService.NewObject <TDataType>(runtimeProxyFacade, rootObjectId, isolationLevel == IsolationLevel.ReadOnly); if (isolationLevel == IsolationLevel.ReadOnly) { immutableProxyMap.AddProxy(rootObjectId, rootProxy); } else { mutableProxyMap.AddProxy(rootObjectId, rootProxy); } }
public RuntimeProxyFacade(TypesService typesService, ObjectInstancesService objectInstancesService, ObjectInstancesService immutableInstancesService, CollectionInstancesService collectionInstancesService, CollectionInstancesService immutableCollectionInstancesService, DictionaryInstancesService dictionaryInstancesService, DictionaryInstancesService immutableDictionaryInstancesService, IProxyMap mutableProxyMap, IProxyMap immutableProxyMap, ProxyCreatorService proxyCreatorService) { this.objectInstancesService = objectInstancesService; this.immutableInstancesService = immutableInstancesService; this.collectionInstancesService = collectionInstancesService; this.dictionaryInstancesService = dictionaryInstancesService; this.immutableCollectionInstancesService = immutableCollectionInstancesService; this.immutableDictionaryInstancesService = immutableDictionaryInstancesService; this.mutableProxyMap = mutableProxyMap; this.immutableProxyMap = immutableProxyMap; this.proxyCreatorService = proxyCreatorService; this.typesService = typesService; }
private void InitializeServices() { typesService = new TypesService(provider); var interfaceToTypeIdMapping = typesService.InitializeTypeSystem(serverContext.EntityTypes); var completeTypesList = interfaceToTypeIdMapping.Keys; generationService = new GenerationService(typesService); // TODO (nsabo) Optional loading of proxy types from the given assembly (we dont want always to generate on small devices, Silverlight...) // Note: Collection/Dictionary types are not saved in the assembly var interfaceToGeneratedMapping = generationService.GenerateProxyTypes(completeTypesList, Properties.Settings.Default.SaveGeneratedAssemblyToDisk, Properties.Settings.Default.GeneratedAssemblyFileName); proxyCreatorService = new ProxyCreatorService(completeTypesList, interfaceToTypeIdMapping, interfaceToGeneratedMapping); StaticProxyFacade.Initialize(typesService); }
private void InitializeServices(Type rootEntityType, Type[] entityTypes, UpgradeConfiguration upgradeConfiguration) { this.rootEntityType = rootEntityType; this.entityTypes = entityTypes; typesService = new TypesService(provider); objectSerializationService.TypesService = typesService; var interfaceToTypeIdMapping = typesService.InitializeTypeSystem(entityTypes); var completeTypesList = interfaceToTypeIdMapping.Keys; generationService = new GenerationService(typesService); // TODO (nsabo) Optional loading of proxy types from the given assembly (we dont want always to generate on small devices, Silverlight...) // Note: Collection/Dictionary types are not saved in the assembly var interfaceToGeneratedMapping = generationService.GenerateProxyTypes(completeTypesList, Properties.Settings.Default.SaveGeneratedAssemblyToDisk, Properties.Settings.Default.GeneratedAssemblyFileName); proxyCreatorService = new ProxyCreatorService(completeTypesList, interfaceToTypeIdMapping, interfaceToGeneratedMapping); snapshotsService = new SnapshotsService(provider); #region Parent map provider setup if (Properties.Settings.Default.ParentMappingFileStorageUsed) { // Usage of file for caching parent information var indexedFile = new IndexedFileStorage(new FileStream(this.parentMappingFileName, FileMode.Create), Properties.Settings.Default.ParentMappingFileBlockSize, false); indexedFile.Serializer = this.objectSerializationService; disposables.Add(indexedFile); var parentProviderStorage = new CachedWriteNodeProviderUnsafe <Guid, object, EdgeData>( new DirectNodeProviderUnsafe <Guid, object, EdgeData>(indexedFile, true), new LimitedDirectNodeProviderUnsafe <Guid, object, EdgeData>( new LimitedMemoryStorageUnsafe <Guid, object>(Properties.Settings.Default.ParentMappingMemoryMinimumCount, Properties.Settings.Default.ParentMappingMemoryMaximumCount), false) ); disposables.Add(parentProviderStorage); mutableParentProvider = new ParentMapProvider(parentProviderStorage, provider, null, true); } else { // Default parent information is stored in memory and has only the last snapshot available mutableParentProvider = new ParentMapProvider(new DirectNodeProviderUnsafe <Guid, object, EdgeData>(new MemoryStorageUnsafe <Guid, object>(), false), provider, null, true); } #endregion #region Merge rule provider setup IMergeRuleProvider mergeRuleProvider = null; if (SnapshotIsolationEnabled) { if (Properties.Settings.Default.ConcurrencyAutoOverrideResolution) { mergeRuleProvider = new AutoOverrideMergeRuleProvider(); } else { if (Properties.Settings.Default.ConcurrencyAttributesEnabled) { mergeRuleProvider = new AttributeBasedMergeRuleProvider(typesService); } else { throw new ArgumentException("No selected provider for merge rules in snapshot isolation conflicts. Check configuration of merge rule providers."); } } } #endregion #region Setup change set provider // TODO (nsabo) Provide option for change set safety when context goes offline, OfflineWorkspaces should enable commits when context is back online if (Properties.Settings.Default.ChangeSetHistoryFileStorageUsed) { var indexedFile = new IndexedFileStorage(new FileStream(Properties.Settings.Default.ChangeSetHistoryFileStorageFileName, FileMode.Create), 256, false); indexedFile.Serializer = this.objectSerializationService; disposables.Add(indexedFile); var changeSetProviderStorage = new CachedWriteNodeProviderUnsafe <Guid, object, EdgeData>( new DirectNodeProviderUnsafe <Guid, object, EdgeData>(indexedFile, true), new LimitedDirectNodeProviderUnsafe <Guid, object, EdgeData>( new LimitedMemoryStorageUnsafe <Guid, object>(Properties.Settings.Default.ChangeSetHistoryWriteCacheMinimumCount, Properties.Settings.Default.ChangeSetHistoryWriteCacheMaximumCount), false) ); disposables.Add(changeSetProviderStorage); changeSetProvider = new TrackingChangeSetProvider(changeSetProviderStorage); } else { changeSetProvider = new TrackingChangeSetProvider(new DirectNodeProviderUnsafe <Guid, object, EdgeData>(new MemoryStorageUnsafe <Guid, object>(), false)); } #endregion var immutableParentProvider = new ParentMapProvider(new DirectNodeProviderUnsafe <Guid, object, EdgeData>(new MemoryStorageUnsafe <Guid, object>(), false), provider, null, false); collectedNodesProvider = new CollectedNodesProvider(new DirectNodeProviderUnsafe <Guid, object, EdgeData>(new MemoryStorageUnsafe <Guid, object>(), false), provider); commitDataService = new CommitDataService(provider, typesService, snapshotsService, mutableParentProvider, immutableParentProvider, changeSetProvider, new NodeMergeExecutor(mergeRuleProvider, typesService), collectedNodesProvider); workspaceExclusiveLockProvider = new WorkspaceExclusiveLockProvider(); disposables.Add(workspaceExclusiveLockProvider); trackingWorkspaceStateProvider = new TrackingWorkspaceStateProvider(workspaceExclusiveLockProvider); objectInstancesService = new ObjectInstancesService(provider, typesService); subscriptionManagerService = new SubscriptionManagerService(typesService, objectInstancesService); workspaceFacade = new WorkspaceFacade(commitDataService, trackingWorkspaceStateProvider, subscriptionManagerService, snapshotsService, workspaceExclusiveLockProvider); backupService = new BackupService(); bool firstRun = snapshotsService.InitializeSnapshots(); if (firstRun) { InitializeDefaultSnapshot(); } else { OptimizeData(); } StaticProxyFacade.Initialize(typesService); }