예제 #1
0
        /// <summary>
        ///     Sets the factory that should be used for creating instances of <see cref="IResourceManager" />.
        /// </summary>
        /// <param name="factory">The factory.</param>
        /// <param name="flags">The flags.</param>
        /// <exception cref="System.ArgumentNullException"><paramref name="factory" /> was <see langword="null" />.</exception>
        public static void ForResourceManagerUse(
            [NotNull] Func <StyleManager, IResourceManager> factory,
            DependencyCacheFlags flags)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            AddOrUpdateCache(factory, flags);
        }
예제 #2
0
        /// <summary>
        ///     Sets the factory that should be used for creating instances of type <see cref="TDependancy" />.
        /// </summary>
        /// <param name="factory">The factory.</param>
        /// <param name="flags">The flags.</param>
        /// <exception cref="System.ArgumentNullException"><paramref name="factory" /> was <see langword="null" />.</exception>
        public static void ForTypeUse <TDependancy, TArgs>(
            [NotNull] Func <TArgs, TDependancy> factory,
            DependencyCacheFlags flags)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            AddOrUpdateCache(factory, flags);
        }
예제 #3
0
            public DependencyCache([NotNull] Func <TArgs, TDependancy> factory, DependencyCacheFlags flags)
            {
                Debug.Assert(factory != null, "factory != null");
                Factory = factory;
                Flags   = flags;
                switch (flags & CacheTypeMask)
                {
                case DependencyCacheFlags.CachePerArgs:
                    _perArgs    = new ConcurrentDictionary <TArgs, TDependancy>();
                    _globalLock = new object();
                    break;

                case DependencyCacheFlags.CacheGlobal:
                    _globalLock = new object();
                    break;
                }
            }
예제 #4
0
        private static DependencyCache <TDependancy, TArgs> AddOrUpdateCache <TDependancy, TArgs>(
            [NotNull] Func <TArgs, TDependancy> factory,
            DependencyCacheFlags flags)
        {
            Debug.Assert(factory != null, "factory != null");

            return((DependencyCache <TDependancy, TArgs>)_caches.AddOrUpdate(
                       new Tuple <Type, Type>(typeof(TDependancy), typeof(TArgs)),
                       _ => new DependencyCache <TDependancy, TArgs>(factory, flags),
                       (_, old) =>
            {
                Debug.Assert(
                    old is DependencyCache <TDependancy, TArgs>,
                    "old is DependencyCache<TDependancy, TArgs>");
                ((DependencyCache <TDependancy, TArgs>)old).Dispose();
                return new DependencyCache <TDependancy, TArgs>(factory, flags);
            }));
        }