Esempio n. 1
0
        public static ISettingsStorage GetSettings(ICompositionCatalog compositionCatalog, string contentTypeName)
        {
            ISettingsStorage settingsStorage = null;

            lock (_settingsLock) {
                if (_settingStorageMap.TryGetValue(contentTypeName, out settingsStorage))
                {
                    return(settingsStorage);
                }

                // Need to find the settings using MEF (don't use MEF inside of other locks, that can lead to deadlock)

                var contentTypeRegistry = compositionCatalog.ExportProvider.GetExportedValue <IContentTypeRegistryService>();

                var contentType = contentTypeRegistry.GetContentType(contentTypeName);
                Debug.Assert(contentType != null, "Cannot find content type object for " + contentTypeName);

                settingsStorage = ComponentLocatorForOrderedContentType <IWritableSettingsStorage> .FindFirstOrderedComponent(compositionCatalog.CompositionService, contentType);

                if (settingsStorage == null)
                {
                    settingsStorage = ComponentLocatorForOrderedContentType <ISettingsStorage> .FindFirstOrderedComponent(compositionCatalog.CompositionService, contentType);
                }

                if (settingsStorage == null)
                {
                    var storages = ComponentLocatorForContentType <IWritableSettingsStorage, IComponentContentTypes> .ImportMany(compositionCatalog.CompositionService, contentType);

                    if (storages.Any())
                    {
                        settingsStorage = storages.First().Value;
                    }
                }

                if (settingsStorage == null)
                {
                    var readonlyStorages = ComponentLocatorForContentType <ISettingsStorage, IComponentContentTypes> .ImportMany(compositionCatalog.CompositionService, contentType);

                    if (readonlyStorages.Any())
                    {
                        settingsStorage = readonlyStorages.First().Value;
                    }
                }

                Debug.Assert(settingsStorage != null, String.Format(CultureInfo.CurrentCulture,
                                                                    "Cannot find settings storage export for content type '{0}'", contentTypeName));

                if (_settingStorageMap.ContainsKey(contentTypeName))
                {
                    // some other thread came along and loaded settings already
                    settingsStorage = _settingStorageMap[contentTypeName];
                }
                else
                {
                    _settingStorageMap[contentTypeName] = settingsStorage;
                    settingsStorage.LoadFromStorage();
                }
            }

            return(settingsStorage);
        }