示例#1
0
        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);
        }
示例#2
0
        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());
        }
示例#3
0
        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();