Ejemplo n.º 1
0
        private static IProjector BuildProjector(IServiceProvider serviceProvider)
        {
            var projector         = new Projector();
            var partManager       = serviceProvider.GetRequiredService <ApplicationPartManager>();
            var projectionFeature = new ProjectionFeature();

            partManager.PopulateFeature(projectionFeature);

            foreach (var type in projectionFeature.Projections)
            {
                var inspector   = new ProjectionInspector(type);
                var descriptors = inspector.GetDescriptors();

                foreach (var descriptor in descriptors)
                {
                    var provider = Activator.CreateInstance(typeof(ProjectionInvoker <,> .Provider).MakeGenericType(descriptor.SourceType, descriptor.ProjectionType),
                                                            type,
                                                            descriptor);

                    var registerMethodDefinition = typeof(IProjector).GetMethods().Single(p => p.Name == "RegisterProjection" && p.IsGenericMethodDefinition && p.GetGenericArguments().Length == 2);
                    var registerMethod           = registerMethodDefinition.MakeGenericMethod(descriptor.SourceType, descriptor.ProjectionType);
                    registerMethod.Invoke(projector, new object[] { provider });
                }
            }

            return(projector);
        }
        public void PocoProjectionTest()
        {
            var projectionInspector   = new ProjectionInspector(typeof(PocoProjection));
            var projectionDescriptors = projectionInspector.GetDescriptors();

            Assert.AreEqual(6, projectionDescriptors.Count());

            var first = projectionDescriptors.First();

            Assert.AreEqual(typeof(ProjectionSource1), first.SourceType);
            Assert.IsFalse(first.MultipleResults);
            Assert.AreEqual(typeof(ProjectionResult <string>), first.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("Project"), first.Member);

            var second = projectionDescriptors.Skip(1).First();

            Assert.AreEqual(typeof(ProjectionSource1), second.SourceType);
            Assert.IsFalse(second.MultipleResults);
            Assert.AreEqual(typeof(ProjectionResult <string>), second.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("ProjectAsync"), second.Member);

            var third = projectionDescriptors.Skip(2).First();

            Assert.AreEqual(typeof(ProjectionSource2), third.SourceType);
            Assert.IsFalse(third.MultipleResults);
            Assert.AreEqual(typeof(ProjectionResult <string>), third.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("Project2"), third.Member);

            var fourth = projectionDescriptors.Skip(3).First();

            Assert.AreEqual(typeof(ProjectionSource2), fourth.SourceType);
            Assert.IsFalse(fourth.MultipleResults);
            Assert.AreEqual(typeof(ProjectionResult <string>), fourth.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("ProjectToXX"), fourth.Member);

            var fith = projectionDescriptors.Skip(4).First();

            Assert.AreEqual(typeof(ProjectionSource2), fith.SourceType);
            Assert.IsFalse(fith.MultipleResults);
            Assert.AreEqual(typeof(ProjectionResult <string>), fith.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("ABC"), fith.Member);

            var sixth = projectionDescriptors.Skip(5).First();

            Assert.AreEqual(typeof(ProjectionSource1), sixth.SourceType);
            Assert.IsFalse(sixth.MultipleResults);
            Assert.AreEqual(typeof(object), sixth.ProjectionType);
            Assert.AreEqual(typeof(PocoProjection).GetMethod("ABC2"), sixth.Member);
        }