public void Create(CommerceInstanceMetadata metadata)
        {
            _readWriteLock.EnterWriteLock();

            try
            {
                var copy = GetCacheCopy();
                copy.Add(metadata.Name, metadata);

                WriteToFile(copy);

                _cache = copy;
            }
            finally
            {
                _readWriteLock.ExitWriteLock();
            }
        }
        public void CreateInstance(CommerceInstanceMetadata metadata)
        {
            Require.NotNull(metadata, "metadata");

            var current = _metadataStore.GetByName(metadata.Name);
            if (current != null)
                throw new InvalidOperationException("Commerce instance \"" + metadata.Name + "\" already exists.");

            var dbProvider = _dbProviderFactory.GetDbProvider(metadata.DbProviderInvariantName, metadata.DbProviderManifestToken);
            var connectionString = dbProvider.GetConnectionString(metadata);

            Event.Raise(new CommerceInstanceCreating(metadata));

            try
            {
                CreatePhysicalDatabaseIfNotExists(connectionString);

                using (var database = new CommerceDatabase(metadata, dbProvider))
                {
                    dbProvider.DatabaseOperations.CreateDatabase(database);
                }
            }
            catch(Exception ex)
            {
                throw new CommerceDbException("Commerce instance creation failed: " + ex.Message, ex);
            }

            _metadataStore.Create(metadata);

            Event.Raise(new CommerceInstanceCreated(metadata));

            if (InstanceInitializers != null)
            {
                var instance = OpenInstance(metadata.Name);
                foreach (var initializer in InstanceInitializers)
                {
                    initializer.Initialize(instance);
                }
            }
        }
        public void Update(string name, CommerceInstanceMetadata newMetadata)
        {
            _readWriteLock.EnterWriteLock();

            try
            {
                EnsureCacheLoaded();

                if (!_cache.ContainsKey(name))
                    throw new InvalidOperationException("Commerce instance \"" + name + "\" not exists.");

                var copy = GetCacheCopy();
                var oldMetadata = copy[name];

                oldMetadata.DisplayName = newMetadata.DisplayName;
                oldMetadata.ConnectionString = newMetadata.ConnectionString;

                WriteToFile(copy);

                _cache = copy;
            }
            finally
            {
                _readWriteLock.ExitWriteLock();
            }
        }