Как получить CodeGenerationContext в шаблоне t4 при вызове через powershell? - PullRequest
0 голосов
/ 11 сентября 2018

По сути, я пытаюсь автоматизировать / создать сценарий генерации кода всех моих контроллеров и представлений, а также других пользовательских шаблонов из всех моих моделей без необходимости щелкать по каждому из них по отдельности и запускать строительные леса оттуда.

Мне удалось установить пакет nuget MvcScaffolding, чтобы вызвать леса из консоли диспетчера пакетов в Visual Studio 2017. Однако этот метод не поддерживает ModelMetadata (Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata), который эти шаблоны основаны на. То, чего я пытаюсь достичь, это захватить ModelMetadata в любом случае другими способами. Это требует, чтобы я получил CodeGenerationContext для получения ServiceProvider, который мне нужен для получения этого ModelMetadata. Вот код, на который я ссылаюсь:

<#@ template language="C#" HostSpecific="True" Debug="True" #>
<#@ import namespace="System.Diagnostics" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data.Linq" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="System.Web.Mvc.dll" #>
<#@ assembly name="MyProject.dll" #>
<#@ assembly name="Microsoft.AspNet.Scaffolding.12.0.dll" #>
<#@ assembly name="Microsoft.AspNet.Scaffolding.EntityFramework.12.0.dll" #>
<#@ assembly name="Microsoft.Extensions.DependencyInjection.dll" #>
<#@ assembly name="System.ComponentModel.Annotations.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Microsoft.AspNet.Scaffolding" #>
<#@ import namespace="Microsoft.AspNet.Scaffolding.Core" #>
<#@ import namespace="Microsoft.AspNet.Scaffolding.Core.Metadata" #>
<#@ import namespace="Microsoft.AspNet.Scaffolding" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="Microsoft.AspNet.Scaffolding.EntityFramework" #>
<#@ import namespace="Microsoft.Extensions.DependencyInjection" #>
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
<# 
    string dbContextTypeName = Model.dbContextNamespace;
    var efService = (IEntityFrameworkService)Context.ServiceProvider.GetService(typeof(IEntityFrameworkService));
    var efMetadata = efService.AddRequiredEntity(Context, dbContextTypeName, Model.ModelTypeName);
#>

Единственное, чего не хватает, это переменной Context, которая не определена. Я пытаюсь инициализировать его или, что еще лучше, получить к нему доступ, но сейчас я не знаю, где его взять.

Я посмотрел на рассматриваемые DLL выше в Object Browser, чтобы увидеть, могу ли я получить к нему доступ, но мне всегда не хватает исходного CodeGenerationContext.

Я также открыт для любого другого предложения, касающегося автоматизации создания лесов контроллеров / представлений, без необходимости индивидуального взаимодействия с каждой моделью.

Спасибо!

...