Esempio n. 1
0
        /// <inheritdoc cref="Populator.Populate" />
        /// <exception cref="InvalidOperationException">Invalid factory method.</exception>
        public override IUnityContainer Populate(IUnityContainer container, IList <Type> typesWithAttribute)
        {
            IEnumerable <FactoryToRegister> factoriesToRegister =
                typesWithAttribute.SelectMany(providerClassType => GetFactoryToRegisterFor(container, providerClassType));

            foreach (FactoryToRegister factoryToRegister in factoriesToRegister)
            {
                Type   returnType = factoryToRegister.ReturnType;
                string name       = factoryToRegister.Name;
                Func <IUnityContainer, Type, string, object> factory = factoryToRegister.Factory;
                IFactoryLifetimeManager lifetimeManager = factoryToRegister.LifetimeManager;

                container.RegisterFactory(returnType, name, factory, lifetimeManager);
            }

            return(container);
        }
Esempio n. 2
0
        /// <summary>
        ///     Transform a <see cref="MethodInfo" /> and an instance to a <see cref="FactoryToRegister" /> object.
        /// </summary>
        /// <param name="info"><see cref="MethodInfo" /> of the factory method.</param>
        /// <param name="instance">Instance of the factory method.</param>
        /// <returns>Wrapper for easy registration.</returns>
        /// <exception cref="InvalidOperationException">Invalid factory method.</exception>
        private FactoryToRegister CreateFactoryToRegisterFrom(MethodInfo info, object instance)
        {
            RegisterFactoryAttribute attribute = info.GetCustomAttribute <RegisterFactoryAttribute>();
            Type   returnType = attribute.From ?? info.ReturnType;
            string name       = attribute.Name;

            if (returnType == typeof(void))
            {
                throw new InvalidOperationException("Return type must not be void.");
            }

            if (!IsUnityFactorySignature(info))
            {
                throw new InvalidOperationException("Factory method signature does not match.");
            }

            IFactoryLifetimeManager lifetimeManager =
                attribute.LifetimeManager == null
                    ? null
                    : GetInstanceByType <IFactoryLifetimeManager>(attribute.LifetimeManager);

            return(new FactoryToRegister(returnType, name, GetFactoryMethodFor(info, instance), lifetimeManager));
        }
        /// <inheritdoc />
        public IUnityContainer RegisterFactory(Type type, string name, Func <IUnityContainer, Type, string, object> factory, IFactoryLifetimeManager lifetimeManager)
        {
            LifetimeManager manager = (null != lifetimeManager)
                                    ? (LifetimeManager)lifetimeManager
                                    : FactoryLifetimeManager.CreateLifetimePolicy();

            // Validate input
            if (null == type)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (null == factory)
            {
                throw new ArgumentNullException(nameof(factory));
            }
            if (manager.InUse)
            {
                throw new InvalidOperationException(LifetimeManagerInUse);
            }

            // Create registration and add to appropriate storage
            var container = manager is SingletonLifetimeManager ? _root : this;

#pragma warning disable CS0618 // TODO: InjectionFactory
            var injectionFactory = new InjectionFactory(factory);
#pragma warning restore CS0618
            var injectionMembers = new InjectionMember[] { injectionFactory };
            var registration     = new ContainerRegistration(_validators, type, manager, injectionMembers);
            if (manager is ContainerControlledLifetimeManager lifeteime)
            {
                lifeteime.Scope = container;
            }

            // Add or replace existing
            var previous = container.Register(type, name, registration);
            if (previous is ContainerRegistration old &&
                old.LifetimeManager is IDisposable disposable)
            {
                // Dispose replaced lifetime manager
                container.LifetimeContainer.Remove(disposable);
                disposable.Dispose();
            }

            // If Disposable add to container's lifetime
            if (manager is IDisposable managerDisposable)
            {
                container.LifetimeContainer.Add(managerDisposable);
            }

            // Add Injection Members
            injectionFactory.AddPolicies <BuilderContext, ContainerRegistration>(
                type, type, name, ref registration);

            // Check what strategies to run
            registration.BuildChain = _strategiesChain.ToArray()
                                      .Where(strategy => strategy.RequiredToBuildType(this,
                                                                                      type, registration, injectionMembers))
                                      .ToArray();
            // Raise event
            container.Registering?.Invoke(this, new RegisterEventArgs(type, type, name, manager));
            return(this);
        }
Esempio n. 4
0
 public IUnityContainer RegisterFactory(Type type, string name, Func <IUnityContainer, Type, string, object> factory, IFactoryLifetimeManager lifetimeManager)
 {
     throw new NotImplementedException();
 }
        /// <inheritdoc />
        Task IUnityContainerAsync.RegisterFactory(IEnumerable <Type> interfaces, string name, Func <IUnityContainer, Type, string, object> factory, IFactoryLifetimeManager lifetimeManager)
        {
            throw new NotImplementedException();

            //// Validate input
            //// TODO: Move to diagnostic

            //if (null == interfaces) throw new ArgumentNullException(nameof(interfaces));
            //if (null == factory) throw new ArgumentNullException(nameof(factory));
            //if (null == lifetimeManager) lifetimeManager = TransientLifetimeManager.Instance;
            //if (((LifetimeManager)lifetimeManager).InUse) throw new InvalidOperationException(LifetimeManagerInUse);

            //// Create registration and add to appropriate storage
            //var container = lifetimeManager is SingletonLifetimeManager ? _root : this;

            //// TODO: InjectionFactory
            //#pragma warning disable CS0618
            //var injectionFactory = new InjectionFactory(factory);
            //#pragma warning restore CS0618

            //var injectionMembers = new InjectionMember[] { injectionFactory };
            //var registration = new ExplicitRegistration(_validators, (LifetimeManager)lifetimeManager, injectionMembers);

            //// Add Injection Members
            ////injectionFactory.AddPolicies<BuilderContext, ContainerRegistration>(
            ////    type, type, name, ref registration);

            //// Register interfaces
            //var replaced = container.AddOrReplaceRegistrations(interfaces, name, registration)
            //                        .ToArray();

            //// Release replaced registrations
            //if (0 != replaced.Length)
            //{
            //    Task.Factory.StartNew(() =>
            //    {
            //        foreach (ImplicitRegistration previous in replaced)
            //        {
            //            if (0 == previous.Release() && previous.LifetimeManager is IDisposable disposable)
            //            {
            //                // Dispose replaced lifetime manager
            //                container.LifetimeContainer.Remove(disposable);
            //                disposable.Dispose();
            //            }
            //        }
            //    });
            //}

            //return this;
        }
        /// <summary>
        /// Register all the repositories services using the specified options builder.
        /// </summary>
        /// <param name="container">The unity container.</param>
        /// <param name="optionsAction">A builder action used to create or modify options for the repositories.</param>
        /// <param name="assembliesToScan">The assemblies to scan.</param>
        /// <param name="typelifetimeManager">The type lifetime manager for the service.</param>
        /// <param name="factorylifetimeManager">The factory lifetime manager for the service.</param>
        /// <remarks>
        /// This method will scan for repositories and interceptors from the specified assemblies collection, and will register them to the container.
        /// </remarks>
        public static void RegisterRepositories([NotNull] this IUnityContainer container, [NotNull] Action <RepositoryOptionsBuilder> optionsAction, [NotNull] Assembly[] assembliesToScan, ITypeLifetimeManager typelifetimeManager = null, IFactoryLifetimeManager factorylifetimeManager = null)
        {
            Guard.NotNull(container, nameof(container));
            Guard.NotNull(optionsAction, nameof(optionsAction));
            Guard.NotEmpty(assembliesToScan, nameof(assembliesToScan));

            var optionsBuilder = new RepositoryOptionsBuilder();

            optionsAction(optionsBuilder);

            var scanResults = AssemblyScanner.FindRepositoriesFromAssemblies(assembliesToScan);

            // Register scanned types
            scanResults.ForEach(scanResult =>
            {
                foreach (var implementationType in scanResult.ImplementationTypes)
                {
                    container.RegisterType(implementationType);

                    if (scanResult.InterfaceType == typeof(IRepositoryInterceptor))
                    {
                        container.RegisterType(scanResult.InterfaceType, implementationType, implementationType.FullName);
                    }
                    else
                    {
                        container.RegisterType(scanResult.InterfaceType, implementationType);
                    }
                }
            });

            // Register options services
            container.RegisterFactory <IRepositoryOptions>(c =>
            {
                var options = new RepositoryOptions(optionsBuilder.Options);

                foreach (var interceptorType in scanResults.OfType <IRepositoryInterceptor>())
                {
                    if (!options.Interceptors.ContainsKey(interceptorType))
                    {
                        options = options.With(interceptorType, () => (IRepositoryInterceptor)c.Resolve(interceptorType));
                    }
                }

                if (options.LoggerProvider == null)
                {
                    var loggerProviderType = scanResults.OfType <ILoggerProvider>().FirstOrDefault();

                    if (loggerProviderType != null)
                    {
                        options = options.With((ILoggerProvider)c.Resolve(loggerProviderType));
                    }
                }

                if (options.CachingProvider == null)
                {
                    var cacheProviderType = scanResults.OfType <ICacheProvider>().FirstOrDefault();

                    if (cacheProviderType != null)
                    {
                        options = options.With((ICacheProvider)c.Resolve(cacheProviderType));
                    }
                }

                return(options);
            }, factorylifetimeManager);

            // Register resolver
            RepositoryDependencyResolver.SetResolver(type => container.Resolve(type));

            container.RegisterFactory <IRepositoryDependencyResolver>(c => RepositoryDependencyResolver.Current, new ContainerControlledLifetimeManager());
        }
 /// <summary>
 /// Register all the repositories services using the specified options builder.
 /// </summary>
 /// <param name="container">The unity container.</param>
 /// <param name="optionsAction">A builder action used to create or modify options for the repositories.</param>
 /// <param name="typelifetimeManager">The type lifetime manager for the service.</param>
 /// <param name="factorylifetimeManager">The factory lifetime manager for the service.</param>
 /// <remarks>
 /// This method will scan for repositories and interceptors from the assemblies that have been loaded into the
 /// execution context of this application domain, and will register them to the container.
 /// </remarks>
 public static void RegisterRepositories([NotNull] this IUnityContainer container, [NotNull] Action <RepositoryOptionsBuilder> optionsAction, ITypeLifetimeManager typelifetimeManager = null, IFactoryLifetimeManager factorylifetimeManager = null)
 {
     RegisterRepositories(container, optionsAction, AppDomain.CurrentDomain.GetAssemblies(), typelifetimeManager);
 }
 /// <summary>
 /// Register all the repositories services using the specified options builder.
 /// </summary>
 /// <typeparam name="T">Used for scanning the assembly containing the specified type.</typeparam>
 /// <param name="container">The unity container.</param>
 /// <param name="optionsAction">A builder action used to create or modify options for the repositories.</param>
 /// <param name="typelifetimeManager">The type lifetime manager for the service.</param>
 /// <param name="factorylifetimeManager">The factory lifetime manager for the service.</param>
 /// <remarks>
 /// This method will scan for repositories and interceptors from the assemblies that have been loaded into the
 /// execution context of this application domain, and will register them to the container.
 /// </remarks>
 public static void RegisterRepositories <T>([NotNull] this IUnityContainer container, [NotNull] Action <RepositoryOptionsBuilder> optionsAction, ITypeLifetimeManager typelifetimeManager = null, IFactoryLifetimeManager factorylifetimeManager = null)
 {
     RegisterRepositories(container, optionsAction, new[] { typeof(T).GetTypeInfo().Assembly }, typelifetimeManager);
 }