2014-01-12 3 views
1

Я пришел к запутанной части моей разработки для своих приложений.Использование шаблонов T4 для ENUM

Я использую специальный атрибут для аутентификации под названием «Разрешено для», который затем использует типы пользователей.

Например метод будет иметь аннотацию данных [Allowfor(UserType.Admin)], но проблему я имею я хочу, чтобы хранить список UserTypes в базе данных, следующие свойства:

  • Id
  • Deleted
  • Имя
  • Desc

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

Может ли кто-нибудь размахивать советами по этому поводу, так как я не могу сделать это сам и не могу найти много помощи в поисковых системах.

мне просто нужно знать следующие вещи:

  • Как использовать T4 шаблоны или что-то подобное, чтобы создать класс в VS 2013
  • Как получить на это в начале каждой сборки/или мое нажатие кнопки в интерфейсе
  • Любой базу данных смотреть вверх предпочтительно с использованием строки в файле веб-конфигурации или с помощью DbContext (EF, если это возможно)

ответ

1

Я сделал что-то очень похожее с шаблоном T4 s. Трюк заключается в том, чтобы узнать, какие DLL необходимы, найти их и т. Д. (Например, в Visual Studio 2013, EnvDET ссылается как «import namespace =« EnvDTE »вместо EvnDTE.dll

В основном вам нужно играть с ними чтобы попытаться получить желаемый результат. Создайте элемент T4 в своем решении, а затем запустите его.

Я использую объекты команд (и использую библиотеки MySQL для следующего кода), но он должен дать вам представление о как я бегу его.

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".generated.cs" #> 
<#@ Assembly Name="EnvDTE" #> 
<#@ Assembly Name="System.Data" #> 
<#@ Assembly Name="$(SolutionDir)Services.Entities\bin\DevTest\Libraries.DB.dll" #> **// * custom location for custom libraries** 
<#@ Assembly Name="$(SolutionDir)Services.Entities\bin\DevTest\MySql.Data.dll" #> **// custom location for custom libraries** 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Data.SqlClient" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Text.RegularExpressions" #> 

<# 
     string tableName = ""; 
     //string path = Path.GetDirectoryName(Host.TemplateFile); 
     string connectionString = "mysqlConnectionString"; **// replaced with regular value, could pull from web.config but it's only updated rarely** 

     // Get containing project 
     IServiceProvider serviceProvider = (IServiceProvider)Host; 
     DTE dte = (DTE)serviceProvider.GetService(typeof(DTE)); 
     //Project project = dte.Solution.FindProjectItem(Host.TemplateFile).ContainingProject; 
#> 
using System; 
using System.CodeDom.Compiler; 

namespace Services.Entities 
{ 
    [GeneratedCode("TextTemplatingFileGenerator", "10")] 
    public enum Store 
    { 
<# 

    using (var cmd = new Libraries.DB.Mysql.Command(connectionString)) **//Custom libraries to open a disposable command object** 
    { 
     cmd.Clear(); 
     cmd.AppendCmd("select id, storecode, StoreName \n"); 
     cmd.AppendCmd("from stores \n"); 

     var reader = cmd.ExecuteReader(); 
      while(reader.Read()) 
      { 
      int storeId = Convert.ToInt32(reader["id"]); 
      string storecode = reader["storecode"].ToString(); 
      string description = reader["StoreName"].ToString(); 
#> //We now have the data, let's use it! The code in <#= gets populated #>** 
    [Libraries.Utils.Enums.Info(Code = "<#= storecode #>", Name = "<#= description #>")] <#= Sanitize(description) #> = <#= storeId #>, 
<# 
      } 
    } 
#> 
    } 
} 
//This is a method which takes a name like "Some Descripton" and Sanitizes it to Some_Description so it can be usable as an enum** 
<#+ 
     static string Sanitize(string token) 
     { 
       // Replace all invalid chars by underscores 
       token = Regex.Replace(token, @"[\W\b]", "_", RegexOptions.IgnoreCase); 

       // If it starts with a digit, prefix it with an underscore 
       token = Regex.Replace(token, @"^\d", @"_$0"); 

       // Check for reserved words 
       // TODO: Clean this up and add other reserved words (keywords, etc) 
       if (token == "Url") token = "_Url"; 

       return token; 
     } 
#> 

Главное, чтобы отметить об этих файлах является то, что все между < # #> это код который запускается, и вы можете создавать переменные внутри этого кода. Для отображения, как ASP, < # = variable #>.

Я не уверен, что эти файлы автоматически создаются каждый раз, когда вы создаете свое решение, но похоже, что это был бы простой скрипт сборки. Чтобы их создать, при редактировании сохраните. Вы можете щелкнуть правой кнопкой мыши файл и нажать «Запустить пользовательский инструмент» в контекстном меню. Вы увидите ошибку файла с соответствующим сгенерированным файлом для его проверки.

Кстати, выше может будет генерировать что-то вроде этого:

using System; 
using System.CodeDom.Compiler; 

namespace Services.Entities 
{ 
    [GeneratedCode("TextTemplatingFileGenerator", "10")] 
    public enum Store 
    { 
    [Libraries.Utils.Enums.Info(Code = "ST1", Name = "Store 1")] Store1 = 1, 
    [Libraries.Utils.Enums.Info(Code = "ST2", Name = "Store 2")] Store2 = 2, 
    } 
} 

Кстати, все, что находится за пределами тега (< #, < # =, < # +) будет отправлено как выход в класс.Вы должны быть уверены, что ваш шаблон настроен правильно при запуске или вы можете получить ошибки компиляции для класса с отсутствующими скобками и т. Д.

Смежные вопросы