Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
            }
        }