如何在Sitecore中的WeBlog模块中覆盖ITagManager

时间:2016-03-03 10:01:11

标签: sitecore sitecore7.1 weblog

我正在尝试在this answer中实施解决方案,以便能够限制WeBlog中标记云中显示的标记数量。另外,我正在使用文档中的these instructions

我已将WeBlog配置修改为指向我自己的自定义TagManager实现。

<setting name="WeBlog.Implementation.TagManager" value="My.Namespace.CustomTagManager"/>

如果我加载sitecore/admin/showconfig.aspx,我可以确认配置设置已使用新值更新。

我的CustomTagManager目前是ITagManager界面的简单实现。

public class CustomTagManager : ITagManager
{
    public string[] GetTagsByBlog(ID blogId)
    {
        throw new System.NotImplementedException();
    }

    public string[] GetTagsByBlog(Item blogItem)
    {
        throw new System.NotImplementedException();
    }

    public Dictionary<string, int> GetTagsByEntry(EntryItem entry)
    {
        throw new System.NotImplementedException();
    }

    public Dictionary<string, int> GetAllTags()
    {
        throw new System.NotImplementedException();
    }

    public Dictionary<string, int> GetAllTags(BlogHomeItem blog)
    {
        throw new System.NotImplementedException();
    }

    public Dictionary<string, int> SortByWeight(IEnumerable<string> tags)
    {
        throw new System.NotImplementedException();
    }
}

我可以反映已部署的DLL并且看到这些更改肯定已经完成,但更改没有任何影响。没有抛出异常,标签云继续填充,好像我根本没有做任何更改。这就像配置文件更改被完全忽略。

为了编写自己的客户TagManager类,还需要更改哪些内容?

我正在使用WeBlog 5.2和Sitecore 7.1。

1 个答案:

答案 0 :(得分:0)

在查看WeBlog代码后,很明显正在使用回退对象,并且忽略了我的配置更改。

原因是WeBlog确实:

var type = Type.GetType(typeName, false);

GetType方法仅在mscorlib.dll或当前程序集中找到类型时才有效。因此,修复就像提供程序集完全限定名称一样简单。

<setting name="WeBlog.Implementation.TagManager" value="My.Assembly.CustomTagManager, My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>

这是WeBlog代码:

private static T CreateInstance<T>(string typeName, Func<T> fallbackCreation) where T : class
{
    var type = Type.GetType(typeName, false);
    T instance = null;
    if (type != null)
    {
        try
        {
            instance = (T)Sitecore.Reflection.ReflectionUtil.CreateObject(type);
        }
        catch(Exception ex)
        {
            Log.Error("Failed to create instance of type '{0}' as type '{1}'".FormatWith(type.FullName, typeof(T).FullName), ex, typeof(ManagerFactory));
        }
    }

    if(instance == null)
        instance = fallbackCreation();

    return instance;
}