public void Initialize(IPuzzleContainer container)
        {
            container.ComponentRegistered += (s, e) =>
            {
                if (e.Entry.Services.Any(svc => svc.Is <IMessageBroker>()))
                {
                    this.isMessageBrokerRegistered = true;

                    if (this.buffer.Any())
                    {
                        for (var i = buffer.Count; i > 0; i--)
                        {
                            var cmp = this.buffer[i - 1];
                            this.Attach(container, cmp.Item1, cmp.Item2);
                            this.buffer.Remove(cmp);
                        }
                    }
                }
                else if (this.IsInterestingHandler(e.Entry, typeof(IHandleMessage)))
                {
                    if (!this.isMessageBrokerRegistered)
                    {
                        this.buffer.Add(new Tuple <string, IContainerEntry>(e.Entry.Key, e.Entry));
                    }
                    else
                    {
                        this.Attach(container, e.Entry.Key, e.Entry);
                    }
                }
            };
        }
        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);
                    }
                });
            }
        }
        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));
        }
示例#4
0
		/// <summary>
		/// Teardowns this facility.
		/// </summary>
		/// <param name="container">The container hosting the facility.</param>
		public void Teardown( IPuzzleContainer container )
		{
			container.ComponentRegistered -= new EventHandler<ComponentRegisteredEventArgs>( OnComponentRegistered );
		}
示例#5
0
		/// <summary>
		/// Initializes this facility.
		/// </summary>
		/// <param name="container">The container hosting the facility.</param>
		public void Initialize( IPuzzleContainer container )
		{
			this.container = container;
			container.ComponentRegistered += new EventHandler<ComponentRegisteredEventArgs>( OnComponentRegistered );
		}
 public PuzzleContainerServiceProviderFacade(IPuzzleContainer container)
 {
     this.container = container;
 }
示例#7
0
 /// <summary>
 /// Teardowns this facility.
 /// </summary>
 /// <param name="container">The container hosting the facility.</param>
 public void Teardown(IPuzzleContainer container)
 {
     container.ComponentRegistered -= new EventHandler <ComponentRegisteredEventArgs>(OnComponentRegistered);
 }
示例#8
0
 /// <summary>
 /// Initializes this facility.
 /// </summary>
 /// <param name="container">The container hosting the facility.</param>
 public void Initialize(IPuzzleContainer container)
 {
     this.container = container;
     container.ComponentRegistered += new EventHandler <ComponentRegisteredEventArgs>(OnComponentRegistered);
 }
示例#9
0
 public void Teardown( IPuzzleContainer container )
 {
     this.TeardownCalled = true;
 }
示例#10
0
 public void Initialize( IPuzzleContainer container )
 {
     this.InitializeCalled = true;
 }
示例#11
0
 public void Teardown(IPuzzleContainer container)
 {
     this.TeardownCalled = true;
 }
示例#12
0
 public void Initialize(IPuzzleContainer container)
 {
     this.InitializeCalled = true;
 }
		public PuzzleContainerServiceProviderFacade( IPuzzleContainer container )
		{
			this.container = container;
		}
 public void Teardown(IPuzzleContainer container)
 {
 }