Существующий сервис WCF преобразования XML, необходимо интегрировать с MEF? - PullRequest
0 голосов
/ 30 декабря 2010

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

РЕДАКТИРОВАТЬ

Объяснение:

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

1 Ответ

1 голос
/ 30 декабря 2010

Как вы делаете свое 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.

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

...