是否可以在不修改代码的情况下扩展SubSonic生成器? 我想添加我自己的自定义方法,我可以在模板中使用。类似于Utility.GetVariableType方法的类似物。
答案 0 :(得分:3)
您无法扩展内置模板,但您可以使用自己的模板替换,而无需更改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>
您可以从here获取当前版本的内置ActiveRecord模板。
答案 1 :(得分:1)
我找到了解决我自己问题的方法:)
我现在可以在模板中使用我需要的功能扩展SubSonic,而无需重建或更改任何SubSonic代码本身。
它适用于我想做的事情,我认为它对其他人也有用,所以这里是:
创建一个新的类库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("_"))))
}
}
}
编辑您自己的模板,然后在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的实例。要访问这些方法,您需要执行以下操作:
检查结果对象以查看方法的结果。
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类。
答案 2 :(得分:0)
简短的回答是否定的。如果您想出一些有用的东西,请提交补丁,它可能会集成到核心中。您可以在此处提交补丁:http://code.google.com/p/subsonicproject/issues/list
答案 3 :(得分:0)
你能不在模板中导入一个dll?
喜欢
&lt;%@ Import namespace =“NewHelpers.Utilities”%&gt;
然后调用该函数或创建对象的实例