예제 #1
0
        private static void Register <T>(Assembly assembly, Lifetime lifetime, bool allowMultipleImplementations)
        {
            var fromType = typeof(T);
            var toTypes  = from t in assembly.GetTypes()
                           where t.IsClass &&
                           !t.IsAbstract &&
                           t.GetInterface(fromType.Name) != null
                           select t;

            if (toTypes.Count() <= 0)
            {
                return;
            }
            foreach (var toType in toTypes)
            {
                ITypeLifetimeManager manager = (ITypeLifetimeManager)GetLifetimeManager(lifetime);
                //  var manager = GetLifetimeManager(lifetime);
                var actualFromType = GetFromType(fromType, toType);
                if (allowMultipleImplementations)
                {
                    //ensure the same implementation is not re-registered:
                    if (!_UnityContainer.IsRegistered(actualFromType, toType.Name))
                    {
                        _UnityContainer.RegisterType(actualFromType, toType, toType.Name, manager, new InjectionConstructor());
                        _UnityContainer.Configure <Unity.Interception.Interception>()
                        .SetInterceptorFor(toType, new VirtualMethodInterceptor());
                    }
                }
                else if (!_UnityContainer.IsRegistered(actualFromType))
                {
                    _UnityContainer.RegisterType(actualFromType, toType, manager.ToString(), new InjectionConstructor());
                    _UnityContainer.Configure <Unity.Interception.Interception>()
                    .SetInterceptorFor(toType, new VirtualMethodInterceptor());
                }
            }
        }
        /// <inheritdoc />
        IUnityContainer IUnityContainer.RegisterType(Type typeFrom, Type typeTo, string name, ITypeLifetimeManager lifetimeManager, InjectionMember[] injectionMembers)
        {
            var mappedToType   = typeTo;
            var registeredType = typeFrom ?? typeTo;

            if (null == registeredType)
            {
                throw new ArgumentNullException(nameof(typeTo));
            }

            // Validate if they are assignable
            TypeValidator?.Invoke(typeFrom, typeTo);

            try
            {
                LifetimeManager manager = (null != lifetimeManager)
                                        ? (LifetimeManager)lifetimeManager
                                        : TypeLifetimeManager.CreateLifetimePolicy();
                if (manager.InUse)
                {
                    throw new InvalidOperationException(LifetimeManagerInUse);
                }

                // Create registration and add to appropriate storage
                var container    = manager is SingletonLifetimeManager ? _root : this;
                var registration = new ContainerRegistration(_validators, typeTo, manager, injectionMembers);
                if (manager is ContainerControlledLifetimeManager lifeteime)
                {
                    lifeteime.Scope = container;
                }

                // Add or replace existing
                var previous = container.Register(registeredType, 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 disposableManager)
                {
                    container.LifetimeContainer.Add(disposableManager);
                }

                // Add Injection Members
                if (null != injectionMembers && injectionMembers.Length > 0)
                {
                    foreach (var member in injectionMembers)
                    {
                        member.AddPolicies <BuilderContext, ContainerRegistration>(
                            registeredType, mappedToType, name, ref registration);
                    }
                }

                // Check what strategies to run
                registration.BuildChain = _strategiesChain.ToArray()
                                          .Where(strategy => strategy.RequiredToBuildType(this,
                                                                                          registeredType, registration, injectionMembers))
                                          .ToArray();
                // Raise event
                container.Registering?.Invoke(this, new RegisterEventArgs(registeredType,
                                                                          mappedToType,
                                                                          name,
                                                                          manager));
            }
            catch (Exception ex)
            {
                var builder = new StringBuilder();

                builder.AppendLine(ex.Message);
                builder.AppendLine();

                var parts    = new List <string>();
                var generics = null == typeFrom ? typeTo?.Name : $"{typeFrom?.Name},{typeTo?.Name}";
                if (null != name)
                {
                    parts.Add($" '{name}'");
                }
                if (null != lifetimeManager && !(lifetimeManager is TransientLifetimeManager))
                {
                    parts.Add(lifetimeManager.ToString());
                }
                if (null != injectionMembers && 0 != injectionMembers.Length)
                {
                    parts.Add(string.Join(" ,", injectionMembers.Select(m => m.ToString())));
                }

                builder.AppendLine($"  Error in:  RegisterType<{generics}>({string.Join(", ", parts)})");
                throw new InvalidOperationException(builder.ToString(), ex);
            }

            return(this);
        }
예제 #3
0
        /// <inheritdoc />
        IUnityContainer IUnityContainer.RegisterType(Type typeFrom, Type typeTo, string name, ITypeLifetimeManager lifetimeManager, InjectionMember[] injectionMembers)
        {
            // Validate input
            var registeredType = ValidateType(typeFrom, typeTo);

            try
            {
                // Lifetime Manager
                var manager = lifetimeManager as LifetimeManager ?? Context.TypeLifetimeManager.CreateLifetimePolicy();
                if (manager.InUse)
                {
                    throw new InvalidOperationException(LifetimeManagerInUse);
                }
                manager.InUse = true;

                // Create registration and add to appropriate storage
                var container = manager is SingletonLifetimeManager ? _root : this;
                Debug.Assert(null != container);

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

                // Add or replace existing
                var registration = new ExplicitRegistration(container, name, typeTo, manager, injectionMembers);
                var previous     = container.Register(registeredType, name, registration);

                // Allow reference adjustment and disposal
                if (null != previous && 0 == previous.Release() &&
                    previous.LifetimeManager is IDisposable disposable)
                {
                    // Dispose replaced lifetime manager
                    container.LifetimeContainer.Remove(disposable);
                    disposable.Dispose();
                }

                // Add Injection Members
                if (null != injectionMembers && injectionMembers.Length > 0)
                {
                    foreach (var member in injectionMembers)
                    {
                        member.AddPolicies <BuilderContext, ExplicitRegistration>(
                            registeredType, typeTo, name, ref registration);
                    }
                }

                // Check what strategies to run
                registration.Processors = Context.TypePipelineCache;

                // Raise event
                container.Registering?.Invoke(this, new RegisterEventArgs(registeredType,
                                                                          typeTo,
                                                                          name,
                                                                          manager));
            }
            catch (Exception ex)
            {
                var builder = new StringBuilder();

                builder.AppendLine(ex.Message);
                builder.AppendLine();

                var parts    = new List <string>();
                var generics = null == typeFrom ? typeTo?.Name : $"{typeFrom?.Name},{typeTo?.Name}";
                if (null != name)
                {
                    parts.Add($" '{name}'");
                }
                if (null != lifetimeManager && !(lifetimeManager is TransientLifetimeManager))
                {
                    parts.Add(lifetimeManager.ToString());
                }
                if (null != injectionMembers && 0 != injectionMembers.Length)
                {
                    parts.Add(string.Join(" ,", injectionMembers.Select(m => m.ToString())));
                }

                builder.AppendLine($"  Error in:  RegisterType<{generics}>({string.Join(", ", parts)})");
                throw new InvalidOperationException(builder.ToString(), ex);
            }

            return(this);
        }