Как вы делаете свою трансформацию 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.
Надеюсь, что вы указываете в правильном направлении?
Можете ли вы уточнить, что вам нужно делать? Зачем вам нужно интегрироваться с MEF? –
У меня есть четыре преобразования xml отеля в wcf-сервисе. На одном конце фиксированный формат xml и другой конец разного формата xml для каждого нового отеля. Еще 20 гостиничных работ придут. для этой повторяющейся работы мне нужна некоторая повторно используемая и расширяемая архитектура. Я хочу преобразовать существующее обновление архитектуры с MEF для будущей перспективы. поэтому я могу сделать лучше для следующих 20 преобразований xml. – sanjay