Sitecore TDS多项目属性基础模板参考不适合我

时间:2015-07-29 21:11:16

标签: sitecore sitecore8 tds

我正在尝试设置多项目属性,就像它在此链接/文章中所说的那样,其中基本模板引用另一个TDS项目。 http://hedgehogdevelopment.github.io/tds/chapter4.html#multi-project-properties

与上述链接类似,我有TDS项目TDS A,它在项目X和TDS项目B(基础模板)中生成代码,在项目Y中生成代码。项目X引用Y和TDS项目A引用多项目中的项目B.项目属性设置。

听起来我正在做文章所说的。但是,从TDS项目A生成的代码无法生成对TDS项目B生成的代码的引用。举例说明发生了什么:所以正确的行为是在Project X中生成的类说D类应该从基类继承从项目Y说出类库,而不是为不存在的类库创建自己的完全限定名称空间版本。它使用自己的程序集命名空间ProjectX.tree.structure.BaseClass,它应该是ProjectY.tree.structure.BaseClass。

有没有人让这个工作。我错过了什么吗?

我通过调整T4模板让它工作,但这不是最好的解决方案

谢谢

2 个答案:

答案 0 :(得分:3)

团队中有人帮助了我。这不是最好的解决方案,但如果您有如上定义的设置,则应该有效。 Trick是在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("_", "");
}

答案 1 :(得分:0)

这篇文章相当老,但是我相信我已经找到了解决方法。我开始浏览GlassV5Item.tt。模板生成继承字符串时,它将调用方法GetObjectInheritanceDefinition(DefaultNamespace, template, true, (string s) => AsInterfaceName(s))。该方法如下所示:

<#+
/// <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 "";
}

代码中令人讨厌的部分是.Select( bt => GetFullyQualifiedName(defaultNamespace, bt, nameFunc))

该模板不尝试解析基本模板的名称空间。我通过更改选择来解决此问题,如下所示: .Select(bt => GetFullyQualifiedName(bt.TargetProjectName, bt, nameFunc))

我不确定TargetProjectName是否是最好的属性,但是由于我们的项目是基于Helix的,因此TargetProjectName的名称和该项目的名称空间是否匹配。

这里最大的关键是,继承的名称空间是从项目中派生的,而不是从硬编码的参数中派生的,正如您所说的那样。

我希望这会有所帮助!