コード例 #1
0
        void Subscribe(IPuzzleContainer container, string key, IContainerEntry entry, Type genericHandler, InvocationModel invocationModel)
        {
            /*
             * Qui abbiamo un problema di questo tipo: quando in Castle viene
             * registrato un componente per più di un servizio, ergo per più
             * interfacce vogliamo venga risolto lo stesso tipo, abbiamo l'inghippo
             * che Castle registra n componenti che risolvono verso lo stesso tipo
             * tante quante sono le interfacce. Quindi l'evento qui registrato viene
             * scatenato n volte e siccome il primo test che noi facciamo è verificare
             * che il servizio sia IMessageHandler se un componente gestisce n messaggi
             * arriviamo qui n volte. Se il componente inoltre richiede la Subscribe
             * automatica per quei messaggi, ha quindi più di un SubscribeToMessageAttribute
             * dobbiamo assicurarci che la subscribe venga fatta una ed una sola volta.
             * per ogni tipo di messaggio.
             */
            var broker      = container.Resolve <IMessageBroker>();
            var messageType = genericHandler.GetGenericArguments().Single();

            if (genericHandler.Is <IHandleMessage>())
            {
                broker.Subscribe(this, messageType, invocationModel, (s, msg) =>
                {
                    var handler = container.Resolve(key, entry.Services.First()) as IHandleMessage;

                    if (handler.ShouldHandle(s, msg))
                    {
                        handler.Handle(s, msg);
                    }
                });
            }
        }
コード例 #2
0
        public void ReplaceType()
        {
            IContainerEntry entry = _repository.Stub <IContainerEntry>();

            ReplaceComponentTypeExpectations <Object>(entry);
            using (_repository.Playback())
                _container.ReplaceComponent <Object>(entry);
        }
コード例 #3
0
 private void AddComponentImpl(Object key, IContainerEntry entry, String alreadyRegisteredMessage)
 {
     if (HasComponent(key))
     {
         throw new ServiceAlreadyRegisteredException(alreadyRegisteredMessage);
     }
     _containerEntries.Add(key, entry);
 }
コード例 #4
0
        public void ReplaceName()
        {
            IContainerEntry entry = _repository.Stub <IContainerEntry>();

            ReplaceComponentNameExpectations(entry);
            using (_repository.Playback())
                _container.ReplaceComponent(Name, entry);
        }
コード例 #5
0
 private void ReplaceComponentTypeExpectations <T>(IContainerEntry entry)
 {
     using (_repository.Record())
     {
         Expect.Call(() => _container.RemoveComponent <T>()).Repeat.Once();
         Expect.Call(() => _container.AddComponent <T>(entry)).Repeat.Once();
     }
 }
コード例 #6
0
 private void ReplaceComponentNameTypeExactExpectations(Type componentType, IContainerEntry entry)
 {
     using (_repository.Record())
     {
         Expect.Call(() => _container.RemoveComponent(Name, componentType)).Repeat.Once();
         Expect.Call(() => _container.AddComponent(Name, componentType, entry)).Repeat.Once();
     }
 }
コード例 #7
0
        public void ReplaceKey()
        {
            IContainerEntry entry = _repository.Stub <IContainerEntry>();

            ReplaceComponentKeyExpectations(entry);
            using (_repository.Playback())
                _container.ReplaceComponent(_key, entry);
        }
コード例 #8
0
 private void ReplaceComponentKeyExpectations(IContainerEntry entry)
 {
     using (_repository.Record())
     {
         Expect.Call(() => _container.RemoveComponent(_key)).Repeat.Once();
         Expect.Call(() => _container.AddComponent(_key, entry)).Repeat.Once();
     }
 }
コード例 #9
0
 public void AddComponent <T>(IContainerEntry entry)
 {
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     AddComponent(typeof(T), entry);
 }
コード例 #10
0
        public void ReplaceNameTypeExact()
        {
            IContainerEntry entry = _repository.Stub <IContainerEntry>();

            ReplaceComponentNameTypeExactExpectations(typeof(Object), entry);
            using (_repository.Playback())
                _container.ReplaceComponent(Name, typeof(Object), entry);
        }
コード例 #11
0
        /// <summary>Unregisters the specified <see cref="IContainerEntry"/>.</summary>
        /// <param name="entry">The entry.</param>
        public void Unregister(IContainerEntry entry)
        {
            var entryImp = (ContainerEntry)entry;

            if (entries.Contains(entryImp))
            {
                entries.Remove(entryImp);
            }
        }
コード例 #12
0
        /// <summary>
        /// Registers the specified entry in this container.
        /// </summary>
        /// <param name="entry">The entry to register.</param>
        /// <returns>This container instance.</returns>
        public IPuzzleContainer Register(IContainerEntry entry)
        {
            Ensure.That(entry).Named("entry").IsNotNull();

            allEntries.Add(entry);

            this.OnComponentRegistered(new ComponentRegisteredEventArgs(entry));

            return(this);
        }
コード例 #13
0
        void Attach(IPuzzleContainer container, string key, IContainerEntry entry)
        {
            var invocationModel = entry.Component.Is <INeedSafeSubscription>() ?
                                  InvocationModel.Safe :
                                  InvocationModel.Default;

            entry.Component.GetInterfaces()
            .Where(i => i.Is <IHandleMessage>() && i.IsGenericType)
            .ForEach(t => this.Subscribe(container, key, entry, t, invocationModel));
        }
コード例 #14
0
 public void AddComponent <T>(String name, IContainerEntry entry)
 {
     if (String.IsNullOrEmpty(name))
     {
         throw new ArgumentNullException(nameof(name));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     AddComponent(name, typeof(T), entry);
 }
コード例 #15
0
 public void AddComponent(Object key, IContainerEntry entry)
 {
     if (key == null)
     {
         throw new ArgumentNullException(nameof(key));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     AddComponentImpl(key, entry, String.Format(ServiceWithKeyAlreadyRegistered, key));
 }
コード例 #16
0
 public void AddComponent(String name, IContainerEntry entry)
 {
     if (String.IsNullOrEmpty(name))
     {
         throw new ArgumentNullException(nameof(name));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     AddComponentImpl(new NameKey(name), entry, String.Format(ServiceWithNameAlreadyRegistered, name));
 }
コード例 #17
0
 public void AddComponent(Type type, IContainerEntry entry)
 {
     if (type == null)
     {
         throw new ArgumentNullException(nameof(type));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     AddComponentImpl(new TypeKey(type), entry, String.Format(ServiceWithTypeAlreadyRegistered, type));
 }
コード例 #18
0
        public void puzzleContainer_register_should_raise_componentRegistered_event_with_a_reference_to_the_registered_entry()
        {
            IContainerEntry expected = EntryBuilder.For <Object>();
            IContainerEntry actual   = null;

            var container = new PuzzleContainer();

            container.ComponentRegistered += (s, e) => actual = e.Entry;

            container.Register(expected);

            Assert.AreEqual(expected, actual);
        }
コード例 #19
0
 public static void ReplaceComponent <T>(this IServiceContainer container, IContainerEntry entry)
 {
     if (container == null)
     {
         throw new ArgumentNullException(nameof(container));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     container.RemoveComponent <T>();
     container.AddComponent <T>(entry);
 }
コード例 #20
0
        public void puzzleContainer_register_entries_using_valid_entry_should_resolve_the_given_entries()
        {
            var container = new PuzzleContainer();

            IContainerEntry e1 = EntryBuilder.For <ArgumentException>();
            IContainerEntry e2 = EntryBuilder.For <ArgumentNullException>();

            container.Register(new[] { e1, e2 });
            var obj1 = container.Resolve <ArgumentException>();
            var obj2 = container.Resolve <ArgumentNullException>();

            Assert.IsNotNull(obj1);
            Assert.IsNotNull(obj2);
        }
コード例 #21
0
ファイル: EntryFactory.cs プロジェクト: sandbrock/towatioc
        public static IContainerEntry GetEntry(LifestyleType lifestyleType, Type dataType)
        {
            IContainerEntry result = null;

            switch (lifestyleType)
            {
            case LifestyleType.Transient:
                result = new TransientEntry(dataType);
                break;

            case LifestyleType.Singleton:
                result = new SingletonEntry(dataType);
                break;
            }

            return(result);
        }
コード例 #22
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ComponentRegisteredEventArgs"/> class.
 /// </summary>
 /// <param name="entry">The entry.</param>
 public ComponentRegisteredEventArgs(IContainerEntry entry)
 {
     //Ensure.That( entry ).Named( "entry" ).IsNotNull();
     this.Entry = entry;
 }
コード例 #23
0
        Object ResolveEntry(IContainerEntry entry)
        {
            if (entry.Lifestyle == Lifestyle.Singleton && this.trackedSingletons.ContainsKey(entry))
            {
                return(this.trackedSingletons[entry]);
            }

            Object instance = null;

            if (entry.Factory != null)
            {
                instance = entry.Factory.DynamicInvoke();
            }
            else
            {
                var ctor = entry.Component
                           .GetConstructors()
                           .FirstOrDefault(x =>
                {
                    return(!x.IsStatic && x.GetParameters()
                           .All(y =>
                    {
                        var pti = y.ParameterType;

                        if (entry.Parameters.ContainsKey(y.Name) && pti.IsAssignableFrom(entry.Parameters[y.Name].GetType()))
                        {
                            return true;
                        }

                        if (this.IsRegistered(pti))
                        {
                            return true;
                        }

                        if (pti.IsArray && pti.HasElementType)
                        {
                            var eti = pti.GetElementType();

                            return this.IsRegistered(eti);
                        }

                        if (pti.IsGenericType)
                        {
                            //is "IEnumerable"
                        }

                        return false;
                    }));
                });

                Ensure.That(ctor)
                .Named("ctor")
                .WithMessage("Cannot find any valid constructor fot type {0}.", entry.Component.FullName)
                .IsNotNull();

                var ctorParams = ctor.GetParameters();
                var pars       = new Object[ctorParams.Length];
                for (int i = 0; i < pars.Length; i++)
                {
                    var p = ctorParams[i];
                    if (entry.Parameters.ContainsKey(p.Name))
                    {
                        pars[i] = entry.Parameters[p.Name];
                    }
                    else
                    {
                        var pti = p.ParameterType;
                        if (pti.IsArray && pti.HasElementType)
                        {
                            var eti = pti.GetElementType();
                            var all = this.ResolveAll(eti);
                            pars[i] = all;
                        }
                        else
                        {
                            pars[i] = this.Resolve(pti);
                        }
                    }
                }

                instance = ctor.Invoke(pars);
            }

            if (instance != null)
            {
                foreach (var x in entry.Parameters)
                {
                    var prop = entry.Component.GetProperties().SingleOrDefault(p => p.Name == x.Key);
                    if (prop != null && prop.CanWrite && prop.PropertyType.IsAssignableFrom(x.Value.GetType()))
                    {
                        prop.SetValue(instance, x.Value, null);
                    }
                }

                //qui si potrebbe ipotizzare un qualcosa di simile a castle
                //che cerca di risolvere le proprietà pubbliche esposte dal tipo
                //appena risolto.

                if (entry.Lifestyle == Lifestyle.Singleton)
                {
                    this.trackedSingletons.Add(entry, instance);
                }
            }

            return(instance);
        }
コード例 #24
0
        public void TestGetSingletonEntry()
        {
            IContainerEntry entry = EntryFactory.GetEntry(LifestyleType.Singleton, typeof(ConnectionName));

            Assert.NotNull(entry);
        }
コード例 #25
0
 bool IsInterestingHandler(IContainerEntry entry, Type t)
 {
     return(entry.Services.Any(s => s.Is(t)) || entry.Component.Is(t));
 }
コード例 #26
0
		Type GetTypeToResolve( IContainerEntry entry )
		{
			return entry.Services.Any() 
				? entry.Services.First() 
				: entry.Component;
		}
コード例 #27
0
ファイル: BootableFacility.cs プロジェクト: adamralph/Radical
 Type GetTypeToResolve(IContainerEntry entry)
 {
     return(entry.Services.Any()
         ? entry.Services.First()
         : entry.Component);
 }
コード例 #28
0
 public static void ReplaceComponent(this IServiceContainer container, String name, Type type, IContainerEntry entry)
 {
     if (container == null)
     {
         throw new ArgumentNullException(nameof(container));
     }
     if (String.IsNullOrEmpty(name))
     {
         throw new ArgumentNullException(nameof(name));
     }
     if (entry == null)
     {
         throw new ArgumentNullException(nameof(entry));
     }
     container.RemoveComponent(name, type);
     container.AddComponent(name, type, entry);
 }
コード例 #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ComponentRegisteredEventArgs"/> class.
 /// </summary>
 /// <param name="entry">The entry.</param>
 public ComponentRegisteredEventArgs( IContainerEntry entry )
 {
     //Ensure.That( entry ).Named( "entry" ).IsNotNull();
     this.Entry = entry;
 }
コード例 #30
0
 private static Boolean AddComponent(IDictionary <Object, IContainerEntry> entries, Object key, IContainerEntry entry)
 {
     if (entries.ContainsKey(key))
     {
         return(false);
     }
     entries.Add(key, entry);
     return(true);
 }
コード例 #31
0
        public void TestGetTransientEntry()
        {
            IContainerEntry entry = EntryFactory.GetEntry(LifestyleType.Transient, typeof(ConnectionName));

            Assert.NotNull(entry);
        }