Расширение SubSonic Generator - PullRequest
       5

Расширение SubSonic Generator

0 голосов
/ 24 апреля 2009

Можно ли расширить генератор SubSonic без изменения его кода? Я хотел бы добавить свои собственные методы, которые я могу использовать внутри шаблонов. Что-то похожее на метод Utility.GetVariableType.

Ответы [ 4 ]

3 голосов
/ 25 апреля 2009

Вы не можете расширить встроенные шаблоны, но вы можете заменить их собственными шаблонами без изменения SubSonic.dll. Смотрите параметр templateDirectory здесь: http://subsonicproject.com/docs/Generated_Classes/#Customizing_Active_Record

Пример конфигурации будет:

<SubSonicService defaultProvider="Northwind" enableTrace="true"
    templateDirectory="C:\Program Files\SubSonic\SubSonic 2.0.3\Templates\MVC">
    <providers>
      <clear/>
      <add name="Northwind" type="SubSonic.SqlDataProvider, SubSonic"
       connectionStringName="Northwind" generatedNamespace="Northwind"/>
    </providers>
  </SubSonicService>

Текущую версию встроенных шаблонов ActiveRecord можно получить по адресу здесь .

1 голос
/ 29 апреля 2009

Я нашел решение для своей проблемы :).
Теперь я могу расширить SubSonic функциональностью, которая мне нужна в шаблонах, без необходимости перестраивать или изменять какой-либо код SubSonic.
Это работает для того, что я хотел сделать, и я думаю, что это может быть полезно для других, так что вот оно:

  1. Создать новую библиотеку классов SubSonicHelper. У моего класса есть класс, похожий на этот:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Helpers.SubSonic
    {
        public class GeneratorHelper
        {
            public bool IsColumnAllowed(string columnName)
            {
                return columnName.Length == 1 ||
                       (columnName.Length > 1 && 
                       (!(columnName[0].ToString().Equals("_") && 
                       columnName[columnName.Length - 1].ToString().Equals("_"))))
            }
        }
    }
    
  2. Сборка сборки и копирование SubSonicHelper.dll в ваш дозвуковой проект.
  3. Настройте проект SubSonic на использование собственных шаблонов с помощью параметра templateDirectory.
  4. Отредактируйте свои собственные шаблоны и в следующем после const bool showGenerationInfo = false;

    System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(
        System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "SubSonicHelper.dll"));
    object instance = a.CreateInstance("Helpers.SubSonic.GeneratorHelper");
    Type type = instance.GetType();
    

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

  1. Создайте массив объектов для параметров метода, который вы хотите использовать. У меня есть параметр columnName, который я установил в col.propertyName. Это внутри цикла foreach (TableSchema.TableColumn col в столбцах) в методе Update.
  2. Вызвать метод, который вы хотите использовать с массивом объектов в качестве аргумента.
  3. Проверьте объект результата, чтобы увидеть результат метода.

    object[] arg = new object[]{col.PropertyName};
    object isColumnAllowedResult = type.InvokeMember("IsColumnAllowed", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, instance, arg);
    if (Convert.ToBoolean(isColumnAllowedResult))
    

Вот и все! Теперь я могу расширить класс SubSonicHelper другими методами, которые я хочу использовать внутри шаблона.

0 голосов
/ 24 апреля 2009

нельзя ли импортировать dll в шаблон?
как
<% @ Import namespace = "NewHelpers.Utilities"%>
а затем вызвать функцию или создать экземпляр объекта

0 голосов
/ 24 апреля 2009

Короткий ответ - нет. Если вы придумали что-нибудь полезное, отправьте патч, и он, вероятно, будет интегрирован в ядро. Вы можете отправить патчи здесь: http://code.google.com/p/subsonicproject/issues/list

...