Episerver - Почему BlockData не реализует IContent
Кто-нибудь знает, почему класс BlockData напрямую не реализует IContent? Я знаю, что во время получения BlockData из базы данных прокси, созданный Castle, реализует IContent.
Если Stackru не подходит для такого рода вопросов, переместите его.
3 ответа
Йохан Бьёрнфот из EPiServer объясняет некоторые детали в этом посте.
Выдержка:
"В предыдущих версиях CMS были страницы (PageData) единственный тип контента, который обрабатывал хранилище контента (традиционно DataFactory). В CMS7 это изменилось, поэтому теперь хранилище контента (IContentRepository) обрабатывает экземпляры IContent. Это означает, что требование для.NET Тип, который можно сохранить / загрузить из репозитория контента, заключается в том, что он реализует интерфейс EPiServer.Core.IContent.
Существует несколько реализаций IContent, встроенных в CMS, таких как PageData и ContentFolder (используются для группировки экземпляров общих блоков), и также возможно зарегистрировать пользовательские реализации IContent. Если вы посмотрите на BlockData, вы заметите, что он не реализует IContent, как затем обрабатываются экземпляры общего блока?
Ответ заключается в том, что во время выполнения, когда создается экземпляр общего блока (например, посредством вызова IContentRepository.GetDefault, где T - это тип, наследуемый от BlockData), CMS создаст новый тип.NET, наследующий T, используя технику, называемую mixin, где новый сгенерированный подкласс будет реализовывать некоторые дополнительные интерфейсы (включая IContent)."
BlockData реализует IContent, так как он предназначен для работы как при добавлении к другому элементу контента, такому как экземпляр PageData (он же Локальный блок), так и как автономный экземпляр (akaShared Block). В последнем случае интерфейс добавляется с помощью микширования Castle Windsor, чтобы на него можно было ссылаться.
Решение для этой конструкции было основано на желании использовать одни и те же шаблоны рендеринга независимо от того, является ли блок локальным или общим. Поэтому выбор стоял между наличием большого количества пустых свойств в локальных блоках или текущим решением с использованием миксинов. Оба варианта были протестированы, и в качестве предпочтительного решения был выбран миксин, хотя он и не идеален.
BlockData "реализует IContent", просто сделайте:
var myContent = (IContent)myBlock;
Но если вы случайно обработаете Блок, который сам по себе является свойством (а не ContentReference), это приведение вызовет исключение.
Это будет верно для 100% всех случаев (... используя Math.Round).