Как переопределить ITagManager в модуле WeBlog в Sitecore

Я пытаюсь реализовать решение в этом ответе, чтобы иметь возможность ограничить количество тегов, которые отображаются в облаке тегов в WeBlog. Кроме того, я использую эти инструкции из документации.

Я изменил конфигурацию 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 ответ

Решение

После просмотра кода 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;
}
Другие вопросы по тегам