2010-12-30 2 views
0

Мое приложение в WCF преобразования xml. теперь необходимо перейти на интеграцию с MEF. который является наилучшим способом реализации MEF или какой тип архитектуры я должен использовать для реализации с меньшими усилиями и меньшим изменением существующего кода?Существующий WCF-сервис преобразования xml, необходимо интегрировать с MEF?

EDIT

Объяснение:

У меня есть четыре отеля XML преобразование в службы WCF. На одном конце фиксируется формат xml и другой конец разный xml формат для каждого нового отеля. И еще 20 гостиничных работ придут. для Эта повторяющаяся работа мне нужна некоторая повторно используемая и расширяемая архитектура. Я хочу преобразовать существующие Обновление архитектуры с помощью MEF для перспективы будущего. так что я могу сделать лучше для следующих 20 отелей преобразования xml.

+0

Можете ли вы уточнить, что вам нужно делать? Зачем вам нужно интегрироваться с MEF? –

+0

У меня есть четыре преобразования xml отеля в wcf-сервисе. На одном конце фиксированный формат xml и другой конец разного формата xml для каждого нового отеля. Еще 20 гостиничных работ придут. для этой повторяющейся работы мне нужна некоторая повторно используемая и расширяемая архитектура. Я хочу преобразовать существующее обновление архитектуры с MEF для будущей перспективы. поэтому я могу сделать лучше для следующих 20 преобразований xml. – sanjay

ответ

1

Как вы делаете свою трансформацию 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>(); 

только остальное останется

  1. Создание специализированных переводчиков для каждого типа отелей в общий класс XmlModel.
  2. Сериализация класса XmlModel в целевой xml.

Надеюсь, что вы указываете в правильном направлении?

Смежные вопросы