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); }