//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web { using System; using System.Collections.Generic; using System.Globalization; internal sealed class DynamicModuleRegistry { private const string _moduleNameFormat = "__DynamicModule_{0}_{1}"; private readonly List _entries = new List(); private bool _entriesReadonly; private readonly object _lockObj = new object(); public void Add(Type moduleType) { if (moduleType == null) { throw new ArgumentNullException("moduleType"); } if (!typeof(IHttpModule).IsAssignableFrom(moduleType)) { string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.DynamicModuleRegistry_TypeIsNotIHttpModule), moduleType); throw new ArgumentException(message, "moduleType"); } lock (_lockObj) { if (_entriesReadonly) { // modules have already been initialized, e.g. Application_Start has already run throw new InvalidOperationException(SR.GetString(SR.DynamicModuleRegistry_ModulesAlreadyInitialized)); } _entries.Add(new DynamicModuleRegistryEntry(MakeUniqueModuleName(moduleType), moduleType.AssemblyQualifiedName)); } } public ICollection LockAndFetchList() { lock (_lockObj) { // once the list has been returned, it must be immutable _entriesReadonly = true; return _entries; } } private static string MakeUniqueModuleName(Type moduleType) { // returns a unique name for this module return String.Format(CultureInfo.InvariantCulture, _moduleNameFormat, moduleType.AssemblyQualifiedName, Guid.NewGuid()); } } internal struct DynamicModuleRegistryEntry { public readonly string Name; public readonly string Type; public DynamicModuleRegistryEntry(string name, string type) { Name = name; Type = type; } } }