public ContainerContext(IContainerConfiguration configuration, IClassWrapperCreator classWrapperCreator)
        {
            Configuration       = configuration;
            ClassWrapperCreator = classWrapperCreator;
            ITypesHelper typesHelper = new TypesHelper();

            var funcHelper = new FuncHelper();

            FuncBuilder = new FuncBuilder();
            var classCreator        = new ClassCreator(funcHelper);
            var constructorSelector = new ConstructorSelector();

            CreationContext = new CreationContext(classCreator, constructorSelector, classWrapperCreator);

            var implementationTypesCollection = new ImplementationTypesCollection(configuration.GetTypesToScan(), typesHelper);

            ImplementationCache = new ImplementationCache();
            IAbstractionsCollection abstractionsCollection = new AbstractionsCollection(implementationTypesCollection, ImplementationCache);

            ImplementationConfigurationCache = new ImplementationConfigurationCache(); //l
            var factory = new AutoAbstractionConfigurationFactory(typesHelper, abstractionsCollection, ImplementationConfigurationCache);

            AbstractionConfigurationCollection = new AbstractionConfigurationCollection(factory);
            AbstractionConfigurationCollection.Add(typeof(IContainer), new StupidAbstractionConfiguration(new ContainerImplementationConfiguration()));
        }
        public CompositeContainerContext(IContainerConfiguration configuration, IClassWrapperCreator classWrapperCreator,
                                         IContainerSelector containerSelector)
        {
            this.Configuration  = configuration;
            ClassWrapperCreator = classWrapperCreator;
            typesHelper         = new TypesHelper();

            var funcHelper = new FuncHelper();

            FuncBuilder = new FuncBuilder();
            var classCreator        = new ClassCreator(funcHelper);
            var constructorSelector = new ConstructorSelector();

            CreationContext = new CreationContext(classCreator, constructorSelector, classWrapperCreator);

            var implementationTypesCollection = new ImplementationTypesCollection(configuration, typesHelper);

            ImplementationCache              = new ImplementationCache();
            abstractionsCollection           = new AbstractionsCollection(implementationTypesCollection, ImplementationCache);
            ImplementationConfigurationCache = new ImplementationConfigurationCache();
            var factory = new AutoAbstractionConfigurationFactory(typesHelper, abstractionsCollection,
                                                                  ImplementationConfigurationCache);

            compositeCollection = new CompositeCollection(new[] { new AbstractionConfigurationCollection(factory) },
                                                          containerSelector);
            compositeCollection.Add(typeof(IContainer),
                                    new StupidAbstractionConfiguration(
                                        new ContainerImplementationConfiguration()));
        }
        public void TestNoResult()
        {
            var  types           = new[] { typeof(int) };
            Type abstractionType = typeof(long);
            var  collection      = new ImplementationTypesCollection(new TestConfiguration(types), helper);

            helper.ExpectIsIgnoredImplementation(types[0], false);
            helper.ExpectTryGetImplementation(abstractionType, types[0], null);

            helper.ExpectIsIgnoredImplementation(abstractionType, true);
            CollectionAssert.IsEmpty(collection.GetImplementationTypes(abstractionType));
        }
        public void TestNoResult()
        {
            var types           = new[] { typeof(int) };
            var abstractionType = typeof(long);

            helperMock.Setup(x => x.IsIgnoredImplementation(types[0])).Returns(false);
            helperMock.Setup(x => x.TryGetImplementation(abstractionType, types[0], It.IsAny <Func <Type, IEnumerable <Type> > >())).Returns((Type)null);
            helperMock.Setup(x => x.IsIgnoredImplementation(abstractionType)).Returns(true);

            var collection = new ImplementationTypesCollection(types, helperMock.Object);

            CollectionAssert.IsEmpty(collection.GetImplementationTypes(abstractionType));
        }
        public void TestGetGenericInConfig()
        {
            var types           = new[] { typeof(I1 <>) };
            var abstractionType = typeof(I1 <int>);
            var typeImpl        = abstractionType;

            helperMock.Setup(x => x.IsIgnoredImplementation(types[0])).Returns(false);
            helperMock.Setup(x => x.TryGetImplementation(abstractionType, types[0], It.IsAny <Func <Type, IEnumerable <Type> > >())).Returns(typeImpl);

            var collection = new ImplementationTypesCollection(types, helperMock.Object);

            CollectionAssert.AreEquivalent(new[] { typeImpl }, collection.GetImplementationTypes(abstractionType));
        }
        public void TestGetGenericInCofig()
        {
            var  types           = new[] { typeof(I1 <>) };
            Type abstractionType = typeof(I1 <int>);
            Type typeImpl        = abstractionType;
            var  collection      = new ImplementationTypesCollection(new TestConfiguration(types), helper);

            helper.ExpectIsIgnoredImplementation(types[0], false);
            helper.ExpectTryGetImplementation(abstractionType, types[0], typeImpl);

            CollectionAssert.AreEquivalent(new[] { typeImpl },
                                           collection.GetImplementationTypes(abstractionType));
        }
        public void TestGet()
        {
            var  types           = new[] { typeof(int), typeof(long) };
            Type abstractionType = typeof(long);
            Type typeImpl        = typeof(long);
            var  collection      = new ImplementationTypesCollection(new TestConfiguration(types), helper);

            helper.ExpectIsIgnoredImplementation(types[0], false);
            helper.ExpectTryGetImplementation(abstractionType, types[0], null);

            helper.ExpectIsIgnoredImplementation(types[1], false);
            helper.ExpectTryGetImplementation(abstractionType, types[1], typeImpl);

            CollectionAssert.AreEquivalent(new[] { typeImpl },
                                           collection.GetImplementationTypes(abstractionType));
        }
        public void TestGetGeneric()
        {
            var  types           = new[] { typeof(int) };
            Type abstractionType = typeof(I1 <int>);
            Type typeImpl        = typeof(Guid);
            var  collection      = new ImplementationTypesCollection(new TestConfiguration(types), helper);

            helper.ExpectIsIgnoredImplementation(types[0], false);
            helper.ExpectTryGetImplementation(abstractionType, types[0], null);

            Type definition = abstractionType.GetGenericTypeDefinition();

            helper.ExpectIsIgnoredImplementation(definition, false);
            helper.ExpectTryGetImplementation(abstractionType, definition, typeImpl);

            CollectionAssert.AreEquivalent(new[] { typeImpl },
                                           collection.GetImplementationTypes(abstractionType));
        }