public void Generate() { if (!Directory.Exists(_cachePath)) { Directory.CreateDirectory(_cachePath); } // try to resolve the real repository in the DI container IContainerRegistration registration; lock (DIContainer.Root) registration = DIContainer .Root .GetRegistrationsSnapshot() .FirstOrDefault(kv => kv.Value.MappedToType == typeof(T) && kv.Value.LifetimeManager.LifetimeType == typeof(TransientLifetimeManager)) .Value ; T repository; if (registration != null) { repository = (T)DIContainer.Root.Resolve(registration.RegisteredType, registration.Name); } else { repository = new T(); // couldn't find it so create one with the default } using (repository as IDisposable) { var mappingCollection = (StorageMappingItemCollection)repository.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); var mappingHashValue = mappingCollection.ComputeMappingHashValue(); if (mappingHashValue == _serializableViews?.HashValue) { return; } // generate the views var errors = new List <EdmSchemaError>(); var views = mappingCollection.GenerateViews(errors); if (errors.Any()) { throw new EdmSchemaException(errors); } // serialize them _serializableViews = new SerializableViews(mappingHashValue, views); using (Stream stream = File.Open(_cacheFilePath, FileMode.Create)) new BinaryFormatter().Serialize(stream, _serializableViews); } }
/// <summary> /// Initializes a new instance of the <see cref="EFRepositoryMappingViewCache{T}"/> class. /// </summary> public EFRepositoryMappingViewCache() { _cachePath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), nameof(EFRepository), typeof(T).Namespace); _cacheFilePath = Path.Combine( _cachePath, typeof(T).Name + CacheFileSuffix); // Load from an existing file if (File.Exists(_cacheFilePath)) { using (Stream stream = File.Open(_cacheFilePath, FileMode.Open)) _serializableViews = (SerializableViews) new BinaryFormatter().Deserialize(stream); } if (_serializableViews == null) { Generate(); } }