public static void RegisterByAttribute(this IUnityContainer container, bool mockMode, params Assembly[] assemblies) { _container = container; _collectionItemsForType = new Dictionary <Type, List <ResolutionItem> >(); _keysForTypes = new Dictionary <Type, HashSet <string> >(); _interceptorWrapper = CreateInterceptorWrapper(); _componentResolver = new UnityComponentResolver(container); var scanAndRegisterActions = new List <IList <string> > { ScanAndRegister <RegisterSingletonAttribute, ContainerControlledLifetimeManager>(mockMode, assemblies), ScanAndRegister <RegisterPerRequestAttribute, HttpContextLifetimeManager>(mockMode, assemblies), ScanAndRegister <RegisterTransientAttribute, TransientLifetimeManager>(mockMode, assemblies), }; var errorMessages = scanAndRegisterActions.SelectMany(msg => msg).ToList(); ContainerAttributeUtils.ThrowIfError(errorMessages); }
private static void EnsureNotAlreadyRegistered(RegistrationContext reg) { var type = reg.IsConcrete ? reg.ToType : reg.FromType; if (!_container.IsRegistered(type)) { return; } var attrName = ContainerAttributeUtils.GetFriendlyName(reg.Attribute); var msg = $"{type}: This type has already been registered"; if (!reg.IsConcrete) { msg += $" as {reg.ToType}"; } msg += ". Registrations cannot be overriden.\n" + $"To register a collection of components use to be resolved together use [{attrName}(OfCollection = true)].\n" + $"To register multiple instances of the same type to be resolved individually by key use [{attrName}(Key = MyKey)]"; throw new RegistrationFailedException(msg); }