Sitecore TDS多项目属性基础模板引用不适用于我

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中生成的

我正试图设置多项目属性,就像它在本链接/文章中所说的那样,将基本模板引用到另一个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模板使其工作,但这不是最好的解决方案


谢谢

团队中有人帮了我这个忙。这不是最好的解决方案,但如果您有上面定义的设置,则应该可以使用。诀窍是在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就没有问题。是的,同一项目中的模型工作得很好。但我们希望将基础模板分开,并计划在不同的网站上共享它们。这是可以理解的,对于项目分离来说非常有意义。感谢分享您的解决方案。有人能想出比下面硬编码方法更好的解决方案吗?