Как переопределить 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;
}