private SPContainerProvider GetOrCreateContainerProvider(ISharePointBoundary tmp)
 {
     SPContainerProviderInfo cpInf;
     if (TryGetContainerProvider(tmp.ID, out cpInf))
     {
         var diff = DateTime.Now - cpInf.LastRefresh;
         if (diff.TotalSeconds >= RefreshPeriod)
         {
             Trace.WriteLine(string.Format(Messages.ContainerProviderNotValidAnymore, tmp, diff.TotalSeconds));
             return UpdateContainerProviderIfNecessary(tmp, cpInf);
         }
         // no updates required --> just return provider
         return cpInf.ContainerProvider;
     }
     // no provider exists, return one
     return CreateContainerProvider(tmp);
 }
        private SPContainerProvider CreateContainerProvider(ISharePointBoundary sharePointScope, IEnumerable<IModule> modules)
        {
            var builder = new SPContainerBuilder();
            foreach (IModule module in modules)
            {
                Trace.WriteLine(string.Format(Messages.RegisteringModule, module.GetType().AssemblyQualifiedName, sharePointScope));
                builder.RegisterModule(module);
            }

            SPContainerProvider containerProvider = new SPContainerProvider(builder.Build());
            lock(_containerProviders)
            {
                _containerProviders[sharePointScope.ID] = new SPContainerProviderInfo(containerProvider);
            }

            return containerProvider;
        }
 private SPContainerProvider CreateContainerProvider(ISharePointBoundary sharePointScope)
 {
     IList<IModule> modules = Configuration.GetConfiguredModules(sharePointScope.PropertyProvider);
     return CreateContainerProvider(sharePointScope, modules);
 }
        private SPContainerProvider UpdateContainerProviderIfNecessary(ISharePointBoundary sharePointScope, SPContainerProviderInfo providerInfo)
        {
            var propertyProvider = sharePointScope.PropertyProvider;
            var configModules = Configuration.ReadAllModuleConfigurations(propertyProvider);
            foreach(var configModule in configModules)
            {
                // if the configuration is newer than the current provider
                // which means that new modules were added, since the provider was built
                if (configModule.ModifiedAt > providerInfo.LastRefresh)
                {
                    Trace.WriteLine(string.Format(Messages.ContainerProviderNeedsUpdate, sharePointScope, providerInfo.LastRefresh, configModule.ModifiedAt, Enum.GetName(typeof(SPScope), configModule.Scope)));
                    return CreateContainerProvider(sharePointScope, Configuration.ReadAllModules(configModules));
                }
            }

            Trace.WriteLine(string.Format(Messages.ContainerProviderNeedsNoUpdate, sharePointScope));
            // nothing changed, return "old" provider which is still valid);)
            return providerInfo.ContainerProvider;
        }