我有一个T4模板,我试图创建它将通过Nhibernate从数据库编码gen查找值。我的问题是我的数据访问层使用Nhibernate配置的路径,以便在启动时编译配置(静态构造函数)。
我不知道如何让t4“看到”这个文件路径,以便当我的代码生成时它可以得到这个配置文件。我也不知道如何使t4“看到”我的配置管理器类;其中包含列出nhibernate xml文件路径的应用程序设置。
我有两个配置文件,一个用于SQL Server,另一个用于sqlite。配置文件需要位于执行程序集的根目录中,以便nhibernate编译配置。
似乎我的模板无法使用高级业务层从数据库中选择数据,而我可能还必须将所有nhibernate配置代码复制到模板中(嗯)。
我的数据库包装器:
private class DBSingleton
{
static DBSingleton()
{
string path = ConfigurationManager.AppSettings["DBConfigFileFullPath"];
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().Configure(path);
cfg.AddInputStream(HbmSerializer.Default.Serialize(System.Reflection.Assembly.GetAssembly(typeof(Plan))));
instance = cfg.BuildSessionFactory();
}
internal static readonly ISessionFactory instance;
}
我的模板:
<#
System.Diagnostics.Debugger.Launch();
string path = Host.ResolvePath(@"..\DB.UnitTest\App.config");
System.Configuration.ConfigurationManager.AppSettings.Add(
"DBConfigFileFullPath", path);
//System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(path); //Path to your config file
//System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
ReferenceValueBL bl = new ReferenceValueBL();
List<ReferenceValue> refVals = bl.Select(); <- problem occurs here
foreach(ReferenceValue rv in refVals)
{
Write("Public ");
Write(rv.ReferenceValueCode.GetType().Name);
Write(" ");
Write(rv.ReferenceValueCode);
Write(" = ");
Write(rv.ReferenceValueCode);
}
#>
当bl变量尝试调用select()时出现问题。这就是DBSingleton初始化的时候。它会抛出一个错误,说应用程序设置为空。如果我将DB类中的相对文件路径硬编码为./Dbconfig.xml,它仍会抛出错误,因为正在执行的程序集在其本地目录中没有该文件。
其他人如何处理t4使用app / web配置文件而不从模板中的配置文件中读取然后将连接字符串注入DAL?我没那么奢侈。该文件必须放在可读的位置,或者t4必须知道在某处。
答案 0 :(得分:0)
其他人如何处理t4使用app / web配置文件而不从模板中的配置文件中读取然后将连接字符串注入DAL?
您可以通过设置“属性”将文本模板转换为runtime text template自定义工具&#34; TextTemplatingFilePreprocessor&#34;。
之后整个代码生成过程将被封装在标准类中,该类将具有生成结果字符串的TransformText
方法 - 然后您可以将其写入您喜欢的文件中。
好的是模板类是部分的,所以你可以添加一些自定义方法的实现。也许是这样的事情:
public partial class RuntimeTextTemplate1
{
public string TransformText(string someParameter)
{
// Do something with someParameter, initialize class field
// with its value and later use this field in your t4 file.
// You also have access to ConfigurationManager.AppSettings here.
return TransformText();
}
}
另外,这个:
foreach(ReferenceValue rv in refVals)
{
Write("Public ");
Write(rv.ReferenceValueCode.GetType().Name);
Write(" ");
Write(rv.ReferenceValueCode);
Write(" = ");
Write(rv.ReferenceValueCode);
}
可以改写为:
foreach(ReferenceValue rv in refVals)
{
#>
Public <#= rv.ReferenceValueCode.GetType().Name #> <#= rv.ReferenceValueCode #> = <#= rv.ReferenceValueCode #>
<#+
}