public void Inject(ITemplatePage page) { if (page == null) { throw new ArgumentNullException(nameof(page)); } PropertyInfo[] properties = page.GetType().GetRuntimeProperties() .Where(p => { return (p.IsDefined(typeof(RazorInjectAttribute)) && p.GetIndexParameters().Length == 0 && !p.SetMethod.IsStatic); }).ToArray(); foreach (var property in properties) { Type memberType = property.PropertyType; object instance = services.GetRequiredService(memberType); FastPropertySetter setter = _propertyCache.GetOrAdd(property, new FastPropertySetter(property)); setter.SetValue(page, instance); } }
public async Task Ensure_Registered_Properties_Are_Injected() { var collection = new ServiceCollection(); string expectedValue = "TestValue"; string templateKey = "key"; collection.AddSingleton(new TestViewModel() { Title = expectedValue }); var propertyInjector = new PropertyInjector(collection.BuildServiceProvider()); var builder = new StringBuilder(); builder.AppendLine("@model object"); builder.AppendLine("@inject RazorLight.Tests.Models.TestViewModel test"); builder.AppendLine("Hello @test"); var engine = new EngineFactory().ForEmbeddedResources(typeof(Root)); engine.Options.DynamicTemplates.Add(templateKey, builder.ToString()); ITemplatePage templatePage = await engine.CompileTemplateAsync(templateKey); //Act propertyInjector.Inject(templatePage); //Assert var prop = templatePage.GetType().GetProperty("test").GetValue(templatePage); Assert.NotNull(prop); Assert.IsAssignableFrom <TestViewModel>(prop); Assert.Equal((prop as TestViewModel).Title, expectedValue); }
public async Task Ensure_Registered_Properties_Are_Injected() { var collection = new ServiceCollection(); string expectedValue = "TestValue"; string templateKey = "key"; collection.AddSingleton(new TestViewModel { Title = expectedValue }); var propertyInjector = new PropertyInjector(collection.BuildServiceProvider()); var builder = new StringBuilder(); builder.AppendLine("@model object"); builder.AppendLine("@inject RazorLight.Tests.Models.TestViewModel test"); builder.AppendLine("Hello @test"); var engine = new RazorLightEngineBuilder() .UseEmbeddedResourcesProject(typeof(Root)) .SetOperatingAssembly(typeof(Root).Assembly) .AddDynamicTemplates(new Dictionary <string, string> { { templateKey, builder.ToString() } }) .Build(); ITemplatePage templatePage = await engine.CompileTemplateAsync(templateKey); //Act propertyInjector.Inject(templatePage); //Assert var prop = templatePage.GetType().GetProperty("test").GetValue(templatePage); Assert.NotNull(prop); var model = Assert.IsAssignableFrom <TestViewModel>(prop); Assert.Equal(model.Title, expectedValue); }