Ejemplo n.º 1
0
        public void CheckInheritance()
        {
            MarkupOpenGenericFactory openGenericFactory = MarkupOpenGenericFactory.Create(typeof(Foo), typeof(IFoo <,>));

            var sut = openGenericFactory.Create <IFoo <string, string> >();

            sut.Hello("hello").Should().Be("hello");
        }
Ejemplo n.º 2
0
        public void CheckInverseInheritance()
        {
            MarkupOpenGenericFactory openGenericFactory2 = MarkupOpenGenericFactory.Create(typeof(Foo), typeof(IFoo2 <,>));

            var sut2 = openGenericFactory2.Create <IFoo2 <string, string> >();

            var actual = sut2.Hello("hello");

            sut2.Hello("hello").Should().Be("hello");
        }
        public void Discover(IEnumerable <Type> types)
        {
            var queryTypes = types
                             .SelectMany(t => t.FindOpenInterfaces(typeof(IQuery <,>)))
                             .ToArray();

            var queryHandlerOpenType = typeof(IQueryHandler <, ,>);


            var specificImplementations = types
                                          .Where(x => x.ImplementsOpenInterface(queryHandlerOpenType))
                                          .Select(x => new
            {
                HandlerType           = x,
                ImplementedInterfaces = x.FindOpenInterfaces(queryHandlerOpenType)
            });
            var markedWithConventionsImplementations = types
                                                       .WithAttribute <MarkupAttribute>(x => x.ServiceType == queryHandlerOpenType)
                                                       .Select(x => MarkupOpenGenericFactory.Create(x, queryHandlerOpenType).MarkupType)
                                                       .Select(x => new
            {
                HandlerType           = x,
                ImplementedInterfaces = x.FindOpenInterfaces(queryHandlerOpenType)
            });

            var queryHandlerTypes = specificImplementations.Union(markedWithConventionsImplementations).ToArray();


            var projectionTypes = types
                                  .Where(t => t.ImplementsOpenInterface(typeof(IProjection <>)) && !t.IsAbstract)
                                  .ToArray();

            var partitionerStreamIndex = types.Where(x => x.ImplementsOpenInterface(typeof(IProjectionStreamPartitioner <>)) && !x.IsAbstract)
                                         .ToDictionary(x => x.FindOpenInterfaces(typeof(IProjectionStreamPartitioner <>)).Single().GetGenericArguments()[0]);

            var partitionerQueryIndex = types.Where(x => x.ImplementsOpenInterface(typeof(IQueryPartitioner <>)) && !x.IsAbstract)
                                        .ToDictionary(x => x.FindOpenInterfaces(typeof(IQueryPartitioner <>)).Single().GetGenericArguments()[0]);

            List <ProjectionInfo> projectionInfos = new List <ProjectionInfo>();

            foreach (var projectionType in projectionTypes)
            {
                var concreteProjectionTypes = projectionType.FindOpenInterfaces(typeof(IProjection <>)).ToArray();
                foreach (var ct in concreteProjectionTypes)
                {
                    var  genericArgs = ct.GetGenericArguments();
                    Type modelType   = genericArgs[0];
                    projectionInfos.Add(new ProjectionInfo()
                    {
                        ModelType      = modelType,
                        ProjectionType = projectionType
                    });
                }
            }

            foreach (var queryHandlerType in queryHandlerTypes)
            {
                foreach (var queryInterface in queryHandlerType.ImplementedInterfaces)
                {
                    var  genericArgs = queryInterface.GetGenericArguments();
                    Type queryType   = genericArgs[0];
                    Type modelType   = genericArgs[1];
                    Type resultType  = genericArgs[2];

                    foreach (var pi in projectionInfos.Where(x => x.ModelType == modelType))
                    {
                        Register(queryType,
                                 modelType,
                                 pi.ProjectionType,
                                 queryHandlerType.HandlerType,
                                 resultType,
                                 partitionerStreamIndex.ContainsKey(pi.ProjectionType) ? new [] { partitionerStreamIndex[pi.ProjectionType] } : Array.Empty <Type>(),
                                 partitionerQueryIndex.ContainsKey(queryType) ? new[] { partitionerQueryIndex[queryType] } : Array.Empty <Type>()
                                 );
                    }
                }
            }

            foreach (var type in queryTypes)
            {
                var  genericArgs = type.GetGenericArguments();
                Type modelType   = genericArgs[0];
                Type resultType  = genericArgs[1];

                if (!_queryTypeIndex.ContainsKey(type))
                {
                    Debug.WriteLine($"Could not find QueryHandler for {type.Name}.");
                }
            }
        }