public override object Create(string key, params object[] args) { var compiler = ObjectUtil.QueryObject <IRazorTemplateCompiler>(args); var factoryProvider = ObjectUtil.QueryObject <ITemplateFactoryProvider>(args); CompiledTemplateDescriptor templateDescriptor = Task.Run(async() => await compiler.CompileAsync(key)).GetAwaiter().GetResult(); Func <ITemplatePage> templateFactory = factoryProvider.CreateFactory(templateDescriptor); TemplateCacheItem item = new TemplateCacheItem(key, templateFactory, templateDescriptor.ExpirationToken); return(item); }
internal RazorCompilerItem CreateDescriptor(string templateKey) { var item = CreateRuntimeCompilationWorkItem(templateKey).GetAwaiter().GetResult(); var taskSource = new TaskCompletionSource <CompiledTemplateDescriptor>(); if (item.SupportsCompilation) { // We'll compile in just a sec, be patient. } else { // If we can't compile, we should have already created the descriptor Debug.Assert(item.Descriptor != null); taskSource.SetResult(item.Descriptor); } // Now the lock has been released so we can do more expensive processing. if (item.SupportsCompilation) { Debug.Assert(taskSource != null); try { CompiledTemplateDescriptor descriptor = CompileAndEmit(item.ProjectItem); descriptor.ExpirationToken = item.ExpirationToken; taskSource.SetResult(descriptor); } catch (Exception ex) { taskSource.SetException(ex); } } return(new RazorCompilerItem(taskSource.Task, item.ExpirationToken)); }
public Func <ITemplatePage> CreateFactory(CompiledTemplateDescriptor templateDescriptor) { string templateKey = templateDescriptor.TemplateKey; if (templateDescriptor.TemplateAttribute != null) { Type compiledType = templateDescriptor.TemplateAttribute.TemplateType; var newExpression = Expression.New(compiledType); var keyProperty = compiledType.GetTypeInfo().GetProperty(nameof(ITemplatePage.Key)); var propertyBindExpression = Expression.Bind(keyProperty, Expression.Constant(templateKey)); var objectInitializeExpression = Expression.MemberInit(newExpression, propertyBindExpression); var pageFactory = Expression .Lambda <Func <ITemplatePage> >(objectInitializeExpression) .Compile(); return(pageFactory); } else { throw new ToolkitException($"Template {templateKey} is corrupted or invalid", this); } }