示例#1
0
        /// <summary>
        /// Create a mutable resource vault to protect a mutable resource
        /// </summary>
        /// <param name="mutableResourceCreator">A delegate that will construct A NEW RESOURCE of type T.  It should NOT
        /// return an existing stringbuilder, it should simply be a delegate to the CTOR.  The vault can only isolate
        /// that which doesn't exist anywhere yet.</param>
        /// <param name="defaultTimeout">the default timeout</param>
        /// <returns>a an object of this type that stores the resource produced by <paramref name="mutableResourceCreator"/> and has a
        /// default timeout of <paramref name="defaultTimeout"/></returns>
        /// <exception cref="ArgumentNullException"><paramref name="mutableResourceCreator"/> was null</exception>
        /// <exception cref="ArgumentOutOfRangeException"><paramref name="defaultTimeout"/> was not positive.</exception>
        public static MutableResourceVault <T> CreateAtomicMutableResourceVault([NotNull] Func <T> mutableResourceCreator,
                                                                                TimeSpan defaultTimeout)
        {
            IMutableResourceVaultFactory <MutableResourceVault <T>, T> factory =
                MutableResourceVaultFactory <MutableResourceVault <T> > .CreateFactory();

            return(factory.CreateMutableResourceVault(mutableResourceCreator, defaultTimeout,
                                                      () => new MutableResourceVault <T>(defaultTimeout)));
        }
            /// <summary>
            /// Add the following factory method to the nested class
            /// </summary>
            /// <param name="defaultTimeOut">the default time-out</param>
            /// <param name="resourceGen">a function to generate the initial value of the protected resource</param>
            /// <returns>An implementation of <see cref="CustomizableMonitorMutableResourceVault{T}"/> that your custom class
            /// (here <see cref="StringBuilderVault"/>) will delegate to.</returns>
            internal static StringBuilderVaultImpl CreateStringBuilderVaultImpl(TimeSpan defaultTimeOut,
                                                                                Func <StringBuilder> resourceGen)
            {
                IMutableResourceVaultFactory <StringBuilderVaultImpl, StringBuilder> factory =
                    StringBuilderVaultImplFactory.CreateSbImplFactory();

                return(factory.CreateMutableResourceVault(
                           resourceGen ?? throw new ArgumentNullException(nameof(resourceGen)), defaultTimeOut,
                           () => new StringBuilderVaultImpl(defaultTimeOut)));
            }