public void Can_register_open_generic_dynamic_decorator_and_resolve_with_different_type_arguments() { var dynamicLookups = new List <KV <Type, object> >(); var dynamicResults = new List <Factory>(); var container = new Container().WithAutoFallbackDynamicRegistrations( DynamicRegistrationFlags.Decorator, (t, k) => { dynamicLookups.Add(KV.Of(t, k)); return(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(A <>) ? typeof(D <>).One() : null); }, t => { var f = t.ToFactory(setup: Setup.Decorator); dynamicResults.Add(f); return(f); }); container.Register(typeof(A <>)); var x = container.Resolve <A <int> >(); Assert.IsInstanceOf <D <int> >(x); Assert.AreEqual(typeof(A <int>), ((D <int>)x).Decoratee.GetType()); Assert.AreEqual(4, dynamicLookups.Count); Assert.AreEqual(1, dynamicResults.Count); var y = container.Resolve <A <string> >(); Assert.IsInstanceOf <D <string> >(y); Assert.AreEqual(typeof(A <string>), ((D <string>)y).Decoratee.GetType()); Assert.AreEqual(8, dynamicLookups.Count); Assert.AreEqual(1, dynamicResults.Count); }
public void Can_decorate_ienumerable_and_alter_the_service_key_filtering_and_works_with_nested_wrappers() { var container = new Container(); container.Register(typeof(IEnumerable <>), setup: Setup.Decorator, made: Made.Of( FactoryMethod.Of <DecoratorTests>("FilterCollectionByMultiKeys"), Parameters.Of.Type(r => r.ServiceKey))); container.Register <AaaaFunc>(made: Parameters.Of.Name("bs", serviceKey: "a", requiredServiceType: typeof(Bbbb))); container.Register <Bbbb>(); container.Register <Bbbb>(serviceKey: "a"); container.Register <Bbbb>(serviceKey: KV.Of <object, int>("a", 1)); var aaa = container.Resolve <AaaaFunc>(); Assert.AreEqual(2, aaa.Bs.Count()); }
public void Can_decorate_array_and_alter_the_service_key_filtering() { var container = new Container(); container.Register(typeof(IEnumerable <>), setup: Setup.Decorator, made: Made.Of( FactoryMethod.Of <DecoratorTests>("FilterCollectionByMultiKeys"), Parameters.Of.Type(r => r.ServiceKey))); container.Register <AaaaArray>(made: Parameters.Of.Name("bs", serviceKey: "a")); container.Register <Bbbb>(); container.Register <Bbbb>(serviceKey: "a"); container.Register <Bbbb>(serviceKey: KV.Of <object, int>("a", 1)); var aaa = container.Resolve <AaaaArray>(); Assert.AreEqual(2, aaa.Bs.Length); }
private static KV <object, object[]>[] GetKeyedCache(IContainer container) => ((Container)container)._registry.Value.KeyedFactoryDelegateCache.Value.Enumerate() .Select(x => KV.Of(x.Key, default(object).One().Append(x.Value.Value.Enumerate().Select(y => y.Key).ToArray()))) .ToArray();