2011-01-12 2 views
1

У меня есть обернутый класс XmlDocument, и в нем я хочу проверить, есть ли объект кешированного XmlDocument с тем же именем, а затем «стать» этим объектом. Есть лучший способ сделать это?Возможно ли, чтобы обернутый объект «стал» объектом того же типа?

namespace myXmlUtilities { 
    class SpecificAutoLoadingCmsXmlDocument : System.Xml.XmlDocument { 
    private string documentName = "joiseyMike.xml"; 

    public void loadFromCms() { 
     if (cache[documentName] != null) 
      LoadXml(((XmlDocument)cache[documentName]).OuterXml); 
     else 
      // ... load from the CMS's database. 
    } 

    public SpecificAutoLoadingCmsXmlDocument() { 
     loadFromCms(); 
    } 
    } 

Отредактировано: Я сделал пример более верным - к жизни. Извинения за более быструю и грязную версию.

+3

Почему бы не убедиться, что вся загрузка происходит из источника с кешем? Почему вы хотите, чтобы он работал как XmlDocument, если вы выполняете проверку конструкции? Не лучше ли было бы проверить кеш до создания любого объекта документа вообще? – Skurmedel

+2

XmlDocument обертывает XmlDocument? Eesh. –

+0

@ Ryan: Это черепахи полностью вниз. – Amy

ответ

4

Вместо этого вы должны использовать шаблон фабрики, который позволит вам включить эту логику в заводские методы.

Таким образом, вы бы в конечном итоге с:

public static XmlDocument GetNewDocument(string documentName) { 
    if (cache[documentName] != null) 
     return cache[documentName]; 
    else 
     return new XmlDocument(); 
} 

Так вместо того, чтобы делать простой новый XmlDocument() ;, вы бы сделать вызов статического метода GetNewDocument().

+0

К сожалению, для этого потребуется образно разрывать нервную систему из приложения. Но мне нравится это. Я подумаю об этом немного, и это может быть способ пойти. –

+0

Я думаю, вам придется разрывать его, иначе вы получите что-то очень взломанное и бесполезное. – Kris

+0

Ваша старая команда написала проклятую вещь :) –

2

Я бы переделал арку здесь. У вас отсутствует разделение проблем. Почему бы не использовать фабрику, чтобы проверить, имеет ли кеш это имя и возвращает ли этот объект обратно? Объект, пытающийся построить себя, кажется мне грязным.