Subsonic 扩展亚音速发生器

Subsonic 扩展亚音速发生器,subsonic,Subsonic,是否可以在不修改代码的情况下扩展亚音速发生器? 我想添加我自己的自定义方法,我可以在模板中使用。类似于Utility.GetVariableType方法。简单的答案是否定的。如果你想出了一些有用的方法,请提交一个补丁,它很可能会集成到核心中。你可以在这里提交补丁:简短的回答是否定的。如果你提出了一些有用的东西,请提交一个补丁,它很可能会集成到核心中。您可以在此处提交修补程序:您不能在模板中导入dll吗 像 然后调用函数或创建对象的实例您不能在模板中导入dll吗 像 然后调用函数或创建对象的实

是否可以在不修改代码的情况下扩展亚音速发生器?
我想添加我自己的自定义方法,我可以在模板中使用。类似于Utility.GetVariableType方法。

简单的答案是否定的。如果你想出了一些有用的方法,请提交一个补丁,它很可能会集成到核心中。你可以在这里提交补丁:

简短的回答是否定的。如果你提出了一些有用的东西,请提交一个补丁,它很可能会集成到核心中。您可以在此处提交修补程序:

您不能在模板中导入dll吗



然后调用函数或创建对象的实例

您不能在模板中导入dll吗


然后调用函数或创建对象的实例

您不能扩展内置模板,但可以使用自己的模板替换它们,而无需更改SubSonic.dll。请参见此处的templateDirectory参数:

一项建议是:

<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>

.

您不能扩展内置模板,但可以使用自己的模板替换它们,而无需更改SubSonic.dll。请参见此处的templateDirectory参数:

一项建议是:

<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>


.

我找到了解决我自己问题的方法:)。
现在,我可以使用模板中所需的功能扩展亚音速,而无需重建或更改任何亚音速代码本身。
它适用于我想做的事情,我认为它也可以对其他人有用,因此它是:

  • 创建一个新的类库。我的课程是这样的:

    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("_"))))
            }
        }
    }
    
  • 生成程序集并将SubSonicHelper.dll复制到亚音速项目
  • 使用templateDirectory参数设置亚音速项目以使用自己的模板
  • 编辑您自己的模板,并在
    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的一个实例,可以在模板中使用它。要访问这些方法,您需要执行以下操作:

  • 为要使用的方法的参数创建对象数组。我将columnName参数设置为col.propertyName。这在Update方法的foreach(TableSchema.TableColumn col in cols)循环中
  • 调用要将对象数组用作参数的方法
  • 检查结果对象以查看方法的结果

    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类

    我找到了解决我自己问题的方法:)。
    现在,我可以使用模板中所需的功能扩展亚音速,而无需重建或更改任何亚音速代码本身。
    它适用于我想做的事情,我认为它也可以对其他人有用,因此它是:

  • 创建一个新的类库。我的课程是这样的:

    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("_"))))
            }
        }
    }
    
  • 生成程序集并将SubSonicHelper.dll复制到亚音速项目
  • 使用templateDirectory参数设置亚音速项目以使用自己的模板
  • 编辑您自己的模板,并在
    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的一个实例,可以在模板中使用它。要访问这些方法,您需要执行以下操作:

  • 为要使用的方法的参数创建对象数组。我将columnName参数设置为col.propertyName。这在Update方法的foreach(TableSchema.TableColumn col in cols)循环中
  • 调用要将对象数组用作参数的方法
  • 检查结果对象以查看方法的结果

    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类

    我在GAC中有一个带有NewHelpers.Utilities命名空间的dll,并将其添加到需要创建DAL的项目中的引用中。将导入行添加到模板中,但在调用静态方法时,亚音速崩溃并出现错误:尝试执行generate。helper类和方法都是静态的,我可以从另一个项目调用它们,这样它们就可以工作了。我应该说我使用sonic.exe generate/out Generated生成DAL。也许这是个问题?我在GAC中有一个带有NewHelpers.Utilities命名空间的dll,并将其添加到需要创建DAL的项目中的引用中。将导入行添加到模板中,但在调用静态方法时,亚音速崩溃并出现错误:尝试执行generate。helper类和方法都是静态的,我可以从另一个项目调用它们,这样它们就可以工作了。我应该说我使用sonic.exe generate/out Generated生成DAL。也许这是个问题?