Ho la seguente classe che rappresenta una configurazione XML memorizzata nel DB:
using System.IO;
using System.Xml;
using System.Xml.Serialization;
[XmlRoot("ModalConfiguration")]
public class XmlConfiguration
{
[XmlElement("Field1")]
public XmlConfigurationField Field1 { get; set; }
[XmlElement("Field2")]
public XmlConfigurationField Field2 { get; set; }
[XmlElement("Field3")]
public XmlConfigurationField Field3 { get; set; }
public static XmlConfiguration GetFromXmlString(string xmlString)
{
using (TextReader reader = new StringReader(xmlString))
{
var xmlSerializer = new XmlSerializer(typeof(XmlConfiguration));
return xmlSerializer.Deserialize(reader) as XmlConfiguration;
}
}
public string ToXmlString()
{
var sw = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(sw))
{
var xmlSerializer = new XmlSerializer(typeof(XmlConfiguration));
xmlSerializer.Serialize(writer, this);
return sw.ToString();
}
}
}
Un collega mi ha detto che questa non è una buona pratica, specialmente il metodo statico di fabbrica, dal momento che il tipo non dovrebbe essere consapevole di come è stato costruito. Invece, mi ha suggerito di creare una classe separata con due metodi, uno che accetta una stringa XML restituisce un oggetto XmlConfiguration
e uno che accetta un oggetto e restituisce una stringa; e lasciare questa classe come un semplice DTO.
Tuttavia, non vedo alcun problema nell'oggetto stesso che conosce gli interni della sua costruzione (per deserializzazione), e al contrario penso che otteniamo un buon incapsulamento con il mio approccio.
Che cosa pensi, puoi segnalare alcuni vantaggi o svantaggi dei due approcci?