我的应用程序是在xml转换的WCF中。现在需要改变以与MEF集成。这是实现MEF的最佳方式,或者我应该使用哪种类型的架构来减少现有代码的工作量并减少更改?
修改
说明:
我有四个酒店xml转型 在wcf服务。一端是固定的 格式化xml和另一端不同 每个新酒店的xml格式 另外20个酒店工作将来临。对于 这个重复的工作我需要一些 可重复使用和可扩展的架构。 我想转换现有的 使用MEF进行架构升级 未来的前景。所以我可以做得更好 接下来的20个酒店xml转型。
答案 0 :(得分:1)
你是如何进行Xml转换的?是通过代码还是XSLT?
如果通过代码,我会定义一个将您的xml转换为通用模型的IXmlTranslator
:
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。希望指出你正确的方向?