Ejemplo n.º 1
0
        /// <summary>
        /// Attempts to resolve, and on failure, registers and tries again.
        /// Might still return null, so must be checked after the call against default{classT}.
        /// </summary>
        /// <typeparam name="classT">The type of the class t.</typeparam>
        /// <param name="diContainer">The di container.</param>
        /// <param name="storageRule">The storage rule.</param>
        /// <param name="boundInstance">The bound instance.</param>
        /// <param name="creator">The creator.</param>
        /// <param name="conflictResolver">The conflict resolver.</param>
        /// <returns>classT.</returns>
        /// <summary>
        /// Registers the and resolve.
        /// </summary>
        /// <typeparam name="classT">The type of the class t.</typeparam>
        /// <param name="diContainer">The di container.</param>
        /// <param name="storageRule">The storage rule.</param>
        /// <param name="boundInstance">The bound instance.</param>
        /// <param name="creator">The creator.</param>
        /// <param name="conflictResolver">The conflict resolver.</param>
        /// <returns>classT.</returns>
        /// <autogeneratedoc />
        /// TODO Edit XML Comment Template for RegisterAndResolve`1
        public static classT RegisterAndResolve <classT>
        (
            this ISmartDIContainer diContainer,
            StorageRules storageRule =
            StorageRules.AnyAccessLevel,
            object boundInstance  = null,
            Func <object> creator = null,
            Func <IDictionary <Type, ITimeStampedCreatorAndStorageRules>, IConflictResolution> conflictResolver = null
        )
            where classT : class
        {
            var triedOnce = false;

TRYAGAIN:

            // Prevents thrown errors temporarily
            diContainer.IgnoreResolveError = true;

            // Resolves CLASS
            var possibleT = diContainer.Resolve <classT>(storageRule, boundInstance, conflictResolver);

            diContainer.IgnoreResolveError = false;

            if (possibleT.IsNotAnEqualObjectTo(default(classT)))
            {
                return(possibleT);
            }

            // No reason to keep trying
            if (triedOnce)
            {
                return(default);
        /// <summary>
        /// Initializes a new instance of the <see cref="CreatorAndStorageRule" /> class.
        /// </summary>
        /// <param name="creator">The creator.</param>
        /// <param name="storageRule">The storage rule.</param>
        public CreatorAndStorageRule
        (
            Func <object> creator    = null,
            StorageRules storageRule = StorageRules.AnyAccessLevel
        )
        {
            ProvidedStorageRule = storageRule;

            ProvidedCreator = creator;
        }