Sitecore TDS多项目属性基础模板引用不适用于我
我正试图设置多项目属性,就像它在本链接/文章中所说的那样,将基本模板引用到另一个TDS项目 与上面的链接类似,我有TDS Project TDS A在项目X中生成代码,TDS Project B(基本模板)在项目Y中生成代码。项目X在多项目属性设置中引用Y,TDS Project A引用项目B 听起来我在做文章上说的事。但是从TDS项目A生成的代码无法生成对TDS项目B生成的代码的引用。举一个例子说明发生了什么:因此正确的行为是,在项目X中生成的类,比如说类D应该继承基类,比如说从项目Y中生成的类,相反,它为不存在的类基创建自己版本的完全限定命名空间。它使用自己的程序集命名空间ProjectX.tree.structure.BaseClass,而它应该是ProjectY.tree.structure.BaseClass 有人用过这个吗。我错过什么了吗 我已经通过调整T4模板使其工作,但这不是最好的解决方案Sitecore TDS多项目属性基础模板引用不适用于我,sitecore,sitecore8,tds,Sitecore,Sitecore8,Tds,我正试图设置多项目属性,就像它在本链接/文章中所说的那样,将基本模板引用到另一个TDS项目 与上面的链接类似,我有TDS Project TDS A在项目X中生成代码,TDS Project B(基本模板)在项目Y中生成代码。项目X在多项目属性设置中引用Y,TDS Project A引用项目B 听起来我在做文章上说的事。但是从TDS项目A生成的代码无法生成对TDS项目B生成的代码的引用。举一个例子说明发生了什么:因此正确的行为是,在项目X中生成的类,比如说类D应该继承基类,比如说从项目Y中生成的
谢谢团队中有人帮了我这个忙。这不是最好的解决方案,但如果您有上面定义的设置,则应该可以使用。诀窍是在Helpers.tt模板中修改以下方法。添加标有注释的行。应该能够进一步扩展它,而不是硬编码基本项目名称空间。如果我有时间考虑的话,我会发帖的
public static string GetNamespace(string defaultNamespace, SitecoreItem item, bool includeGlobal = false)
{
List<string> namespaceSegments = new List<string>();
// add the following line
namespaceSegments.Add(!item.ReferencedItem ? defaultNamespace : "[BaseProjectNameSpace]");
namespaceSegments.Add(item.Namespace);
string @namespace = AsNamespace(namespaceSegments); // use an extension method in the supporting assembly
return (includeGlobal ? string.Concat("global::", @namespace) : @namespace).Replace(".sitecore.templates", "").Replace("_", "");
}
公共静态字符串GetNamespace(字符串defaultNamespace,SitecoreItem项,bool includeGlobal=false)
{
List namespaceSegments=新列表();
//添加以下行
namespaceSegments.Add(!item.ReferencedItem?defaultNamespace:“[BaseProjectNameSpace]”);
namespaceSegments.Add(item.Namespace);
string@namespace=AsNamespace(namespaceSegments);//在支持程序集中使用扩展方法
return(includeGlobal?string.Concat(“全局::”,@namespace):@namespace).Replace(“.sitecore.templates”,”).Replace(““,”);
}
这篇文章很老了,但我相信我已经找到了解决办法。我开始在玻璃v5item.tt中挖掘。当模板生成继承字符串时,它调用一个方法
GetObjectInheritanceDefinition(DefaultNamespace,template,true,(字符串s)=>AsInterfaceName))
。该方法如下所示:
<#+
/// <summary>
/// Gets the inheritance string for the generated template
/// </summary>
/// <param name="defaultNamespace">The default namespace.</param>
/// <param name="template">The template to get the bases for.</param>
/// <param name="nameFunc">The function to run the base templates names through.</param>
/// <returns></returns>
public static string GetObjectInheritanceDefinition(string defaultNamespace, SitecoreTemplate item, bool includeLeadingComma, Func<string, string> nameFunc)
{
if (item.BaseTemplates.Count > 0)
{
return string.Concat(includeLeadingComma ? ", " : "",
item.BaseTemplates
.Select(bt => GetFullyQualifiedName(defaultNamespace, bt, nameFunc)) // select the name of the template with an 'I' prefix
.Aggregate( (total,next) => total + ", " + next) // basically a string.join(string[], '')
);
}
return "";
}
0)
{
返回字符串.Concat(includeLeadingComma?”,“:”,
item.BaseTemplates
.Select(bt=>GetFullyQualifiedName(defaultNamespace,bt,nameFunc))//选择带有“I”前缀的模板名称
.Aggregate((total,next)=>total+“,“+next)//基本上是一个字符串。join(字符串[],”)
);
}
返回“”;
}
代码中有问题的部分是。选择(bt=>GetFullyQualifiedName(defaultNamespace,bt,nameFunc))
模板不尝试解析基础模板的命名空间。我通过更改选择来解决此问题,如下所示:
。选择(bt=>GetFullyQualifiedName(bt.TargetProjectName,bt,nameFunc))
我不确定TargetProjectName
是否是使用的最佳属性,但由于我们的项目基于Helix,因此TargetProjectName
名称和该项目的命名空间匹配
这里最大的关键是继承的名称空间是从项派生的,而不是从硬编码的参数派生的,正如您所说的那样
我希望这有帮助 这似乎是T4模板的一个问题,公平地说,T4模板非常旧,并且在引入此多项目功能之前就已经存在,所以它们可能没有更新。如果您的模型在同一个项目中,那么注释的名称空间(这可能是它的预期用途)Thx就没有问题。是的,同一项目中的模型工作得很好。但我们希望将基础模板分开,并计划在不同的网站上共享它们。这是可以理解的,对于项目分离来说非常有意义。感谢分享您的解决方案。有人能想出比下面硬编码方法更好的解决方案吗?