diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index 586bf5e628..db50c4e853 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -17,10 +17,9 @@ namespace Umbraco.Core /// /// Constructor /// - /// - public ApplicationContext(PluginTypeResolver pluginResolver) + public ApplicationContext() { - PluginTypes = pluginResolver; + } /// @@ -45,10 +44,6 @@ namespace Umbraco.Core } } - /// - /// Gets the plugin resolver for the application - /// - public PluginTypeResolver PluginTypes { get; private set; } // notes // GlobalSettings.ConfigurationStatus returns the value that's in the web.config, so it's the "configured version" diff --git a/src/Umbraco.Core/PluginTypeResolver.cs b/src/Umbraco.Core/PluginTypeResolver.cs index b187fb8baa..426029de61 100644 --- a/src/Umbraco.Core/PluginTypeResolver.cs +++ b/src/Umbraco.Core/PluginTypeResolver.cs @@ -18,7 +18,7 @@ namespace Umbraco.Core /// This class can expose extension methods to resolve custom plugins /// /// - public class PluginTypeResolver + internal class PluginTypeResolver { private PluginTypeResolver() @@ -50,6 +50,31 @@ namespace Umbraco.Core private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); private readonly HashSet _types = new HashSet(); + /// + /// Used to create instances of the specified type based on the resolved/cached plugin types + /// + /// + /// + internal IEnumerable CreateInstances() + { + var types = ResolveTypes(); + var instances = new List(); + foreach(var t in types) + { + try + { + var typeInstance = (T)Activator.CreateInstance(t); + instances.Add(typeInstance); + } + catch (Exception ex) + { + //TODO: Need to fix logging so this doesn't bork if no SQL connection + //Log.Add(LogTypes.Error, -1, "Error loading ILookup: " + ex.ToString()); + } + } + return instances; + } + /// /// Generic method to find the specified type and cache the result /// diff --git a/src/Umbraco.Core/Resolving/ResolverBase.cs b/src/Umbraco.Core/Resolving/ResolverBase.cs index a89c696db6..d7a62860a8 100644 --- a/src/Umbraco.Core/Resolving/ResolverBase.cs +++ b/src/Umbraco.Core/Resolving/ResolverBase.cs @@ -6,6 +6,8 @@ namespace Umbraco.Core.Resolving internal abstract class ResolverBase where TResolver : class { static TResolver _resolver; + + //TODO: This is not correct, this will be the same lock for all ResolverBase classes!! static readonly ReaderWriterLockSlim ResolversLock = new ReaderWriterLockSlim(); public static TResolver Current diff --git a/src/Umbraco.Tests/PluginTypeResolverExtensions.cs b/src/Umbraco.Tests/PluginTypeResolverExtensions.cs index da4f60020d..91fd0b9010 100644 --- a/src/Umbraco.Tests/PluginTypeResolverExtensions.cs +++ b/src/Umbraco.Tests/PluginTypeResolverExtensions.cs @@ -7,7 +7,7 @@ namespace Umbraco.Tests /// /// Used for PluginTypeResolverTests /// - public static class PluginTypeResolverExtensions + internal static class PluginTypeResolverExtensions { public static IEnumerable ResolveFindMeTypes(this PluginTypeResolver resolver) { diff --git a/src/Umbraco.Web/PluginTypeResolverExtensions.cs b/src/Umbraco.Web/PluginTypeResolverExtensions.cs index 628959bcf2..fa8ac22980 100644 --- a/src/Umbraco.Web/PluginTypeResolverExtensions.cs +++ b/src/Umbraco.Web/PluginTypeResolverExtensions.cs @@ -12,40 +12,15 @@ namespace Umbraco.Web /// public static class PluginTypeResolverExtensions { - private static IEnumerable _lookups; - private static readonly ReaderWriterLockSlim LookupsLocker = new ReaderWriterLockSlim(); /// - /// Returns all available ILookup objects + /// Returns all IDocumentLookup types /// /// /// - internal static IEnumerable ResolveLookups(this PluginTypeResolver resolver) + internal static IEnumerable ResolveLookups(this PluginTypeResolver resolver) { - if (_lookups == null) - { - using (new WriteLock(LookupsLocker)) - { - var lookupTypes = resolver.TypeFinder.FindClassesOfType(); - var lookups = new List(); - foreach (var l in lookupTypes) - { - try - { - var typeInstance = Activator.CreateInstance(l) as IDocumentLookup; - lookups.Add(typeInstance); - } - catch (Exception ex) - { - //TODO: Need to fix logging so this doesn't bork if no SQL connection - //Log.Add(LogTypes.Error, -1, "Error loading ILookup: " + ex.ToString()); - } - } - //set the global - _lookups = lookups; - } - } - return _lookups; + return resolver.ResolveTypes(); } } diff --git a/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs b/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs index 3e10a6e4d6..0e6cae28d2 100644 --- a/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs +++ b/src/Umbraco.Web/Routing/DocumentLookupsResolver.cs @@ -11,9 +11,13 @@ namespace Umbraco.Web.Routing { class DocumentLookupsResolver : ResolverBase { - internal DocumentLookupsResolver(IEnumerable resolvers, IRequestDocumentLastChanceResolver lastChanceResolver) + internal DocumentLookupsResolver(IEnumerable resolvers, IRequestDocumentLastChanceResolver lastChanceResolver) { - _resolvers.AddRange(resolvers); + //TODO: I've changed this to resolve types but the intances are not created yet! + // I've created a method on the PluginTypeResolver to create types: PluginTypesResolver.Current.CreateInstances() + + + _resolverTypes.AddRange(resolvers); _lastChanceResolver.Value = lastChanceResolver; } @@ -31,14 +35,16 @@ namespace Umbraco.Web.Routing #region Resolvers + private readonly List _resolverTypes = new List(); readonly ManyWeightedResolved _resolvers = new ManyWeightedResolved(); - public IEnumerable RequestDocumentResolvers + public IEnumerable GetDocumentLookups { get { return _resolvers.Values; } } - public ManyWeightedResolved RequestDocumentResolversResolution + //why do we have this? + public ManyWeightedResolved GetDocumentLookupResolution { get { return _resolvers; } } diff --git a/src/Umbraco.Web/Routing/DocumentRequest.cs b/src/Umbraco.Web/Routing/DocumentRequest.cs index badad3746b..4aef634980 100644 --- a/src/Umbraco.Web/Routing/DocumentRequest.cs +++ b/src/Umbraco.Web/Routing/DocumentRequest.cs @@ -202,7 +202,7 @@ namespace Umbraco.Web.Routing // the first successful resolver, if any, will set this.Node, and may also set this.Template // some lookups may implement caching Trace.TraceInformation("{0}Begin resolvers", tracePrefix); - var lookups = RoutingContext.DocumentLookupsResolver.RequestDocumentResolvers; + var lookups = RoutingContext.DocumentLookupsResolver.GetDocumentLookups; lookups.Any(lookup => lookup.TrySetDocument(this)); Trace.TraceInformation("{0}End resolvers, {1}", tracePrefix, (this.HasNode ? "a document was found" : "no document was found")); diff --git a/src/Umbraco.Web/UmbracoApplication.cs b/src/Umbraco.Web/UmbracoApplication.cs index 9f31229ab1..fa8c20e49b 100644 --- a/src/Umbraco.Web/UmbracoApplication.cs +++ b/src/Umbraco.Web/UmbracoApplication.cs @@ -34,7 +34,7 @@ namespace Umbraco.Web ClientDependency.Core.CompositeFiles.Providers.BaseCompositeFileProcessingProvider.UrlTypeDefault = ClientDependency.Core.CompositeFiles.Providers.CompositeUrlType.Base64QueryStrings; //create the ApplicationContext - ApplicationContext.Current = new ApplicationContext(PluginTypeResolver.Current) + ApplicationContext.Current = new ApplicationContext() { IsReady = true // fixme }; @@ -43,7 +43,9 @@ namespace Umbraco.Web ApplicationStartupHandler.RegisterHandlers(); // create the resolvers - DocumentLookupsResolver.Current = new DocumentLookupsResolver(ApplicationContext.Current.PluginTypes.ResolveLookups(), new ResolveLastChance()); + DocumentLookupsResolver.Current = new DocumentLookupsResolver( + PluginTypeResolver.Current.ResolveLookups(), + new ResolveLastChance()); RoutesCacheResolver.Current = new RoutesCacheResolver(new DefaultRoutesCache()); OnApplicationStarting(sender, e);