Как вы делаете свое Xml преобразование? Это через код или XSLT?
Если через код, я бы определил IXmlTranslator
, который преобразует ваш xml в общую модель:
public interface IXmlTranslator
{
XmlModel Translate(XElement element);
}
Где XmlModel - ваша общая модель:
public class XmlModel
{
// Properties
}
Вам нужно было бы конкретно знать, какой переводчик использовать, поэтому вам нужно будет передать какие-то метаданные, поэтому мы определим имя:
public interface INamedMetadata
{
string Name { get; }
}
Таким образом, примерный переводчик может выглядеть так:
[Export(typeof(IXmlTranslator),
ExportMetadata("Name", "Null")]
public class NullXmlTranslator : IXmlTranslator
{
public XmlModel Translate(XElement element)
{
return null;
}
}
MEF позаботится о проецировании ваших метаданных в экземпляр INamedMetadata. Затем создайте сервис, который потребляет IXmlTranslator
s:
[Export]
public class XmlTranslatorService
{
private readonly IEnumerable<Lazy<IXmlTranslator, INamedMetadata>> _translators;
[ImportingConstructor]
public XmlTranslatorService(IEnumerable<Lazy<IXmlTranslator, INamedMetadata>> translators)
{
_translators = translators;
}
public XmlModel Translate(string name, XElement element)
{
var translator = GetTranslator(name);
if (translator == null)
throw new ArgumentException("No translator is available to translate the target xml.");
return translator.Translate(element);
}
private IXmlTranslator GetTranslator(string name)
{
var translator = _translators
.Where(t => t.Metadata.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
.Select(t => t.Value)
.FirstOrDefault();
return translator;
}
}
Я сделал перечисление доступных переводчиков частью аргументов конструктора, так как он определяет зависимости, необходимые для работы службы. MEF позаботится о введении этого перечислимого во время композиции.
То, что вам нужно сделать, это либо Import
экземпляр XmlTranslatorService
в любом классе, из которого вы хотите его использовать, либо вы можете инициализировать экземпляр непосредственно из CompositionContainer
, например ::
var service = container.GetExportedValue<XmlTranslatorService>();
Единственное, что осталось бы
- Создание специализированных переводчиков для каждого типа отеля в общий
XmlModel
модельный класс.
- Сериализация класса
XmlModel
в целевой xml.
Надеюсь, это указывает на правильное направление?