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); } }); } }
public void ReplaceType() { IContainerEntry entry = _repository.Stub <IContainerEntry>(); ReplaceComponentTypeExpectations <Object>(entry); using (_repository.Playback()) _container.ReplaceComponent <Object>(entry); }
private void AddComponentImpl(Object key, IContainerEntry entry, String alreadyRegisteredMessage) { if (HasComponent(key)) { throw new ServiceAlreadyRegisteredException(alreadyRegisteredMessage); } _containerEntries.Add(key, entry); }
public void ReplaceName() { IContainerEntry entry = _repository.Stub <IContainerEntry>(); ReplaceComponentNameExpectations(entry); using (_repository.Playback()) _container.ReplaceComponent(Name, entry); }
private void ReplaceComponentTypeExpectations <T>(IContainerEntry entry) { using (_repository.Record()) { Expect.Call(() => _container.RemoveComponent <T>()).Repeat.Once(); Expect.Call(() => _container.AddComponent <T>(entry)).Repeat.Once(); } }
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(); } }
public void ReplaceKey() { IContainerEntry entry = _repository.Stub <IContainerEntry>(); ReplaceComponentKeyExpectations(entry); using (_repository.Playback()) _container.ReplaceComponent(_key, entry); }
private void ReplaceComponentKeyExpectations(IContainerEntry entry) { using (_repository.Record()) { Expect.Call(() => _container.RemoveComponent(_key)).Repeat.Once(); Expect.Call(() => _container.AddComponent(_key, entry)).Repeat.Once(); } }
public void AddComponent <T>(IContainerEntry entry) { if (entry == null) { throw new ArgumentNullException(nameof(entry)); } AddComponent(typeof(T), entry); }
public void ReplaceNameTypeExact() { IContainerEntry entry = _repository.Stub <IContainerEntry>(); ReplaceComponentNameTypeExactExpectations(typeof(Object), entry); using (_repository.Playback()) _container.ReplaceComponent(Name, typeof(Object), entry); }
/// <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); } }
/// <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); }
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)); }
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); }
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)); }
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)); }
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)); }
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); }
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); }
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); }
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); }
/// <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; }
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); }
public void TestGetSingletonEntry() { IContainerEntry entry = EntryFactory.GetEntry(LifestyleType.Singleton, typeof(ConnectionName)); Assert.NotNull(entry); }
bool IsInterestingHandler(IContainerEntry entry, Type t) { return(entry.Services.Any(s => s.Is(t)) || entry.Component.Is(t)); }
Type GetTypeToResolve( IContainerEntry entry ) { return entry.Services.Any() ? entry.Services.First() : entry.Component; }
Type GetTypeToResolve(IContainerEntry entry) { return(entry.Services.Any() ? entry.Services.First() : entry.Component); }
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); }
/// <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; }
private static Boolean AddComponent(IDictionary <Object, IContainerEntry> entries, Object key, IContainerEntry entry) { if (entries.ContainsKey(key)) { return(false); } entries.Add(key, entry); return(true); }
public void TestGetTransientEntry() { IContainerEntry entry = EntryFactory.GetEntry(LifestyleType.Transient, typeof(ConnectionName)); Assert.NotNull(entry); }