在服务层(WCF)中使用MEF

时间:2011-06-07 13:47:13

标签: wcf service mef layer

到目前为止,我发现MEF在表示层方面表现良好,具有以下优势。

一个。 DI(依赖注入)

湾第三方可扩展性(请注意,所有相关方都应使用MEF或需要包装)

℃。零件的自动发现(扩展)

d。 MEF允许使用额外的元数据标记扩展,这有助于丰富的查询和过滤

即可用于解决版本问题以及“DLR和c#动态引用”或“类型嵌入”

如果我错了,请纠正我。

我正在研究是否在WCF的Service层中使用MEF。请与您分享使用这两者的经验以及MEF如何帮助您?

谢谢,

尼尔斯


更新

以下是我迄今为止的研究结果。感谢Matthew的帮助。

  1. 核心服务的MEF - 变更成本并不能证明其好处。这也是一个很大的决定,可能会影响服务层的好坏,因此需要大量的研究。在这种情况下,MEF V2(等待稳定版本)可能会更好,但很少担心在这里使用MEF V1。

  2. 功能服务的MEF执行 - MEF可能会添加值,但它非常特定于服务功能。我们需要深入了解服务要求才能做出决定。

  3. 学习是一个持续的过程,所以大家请分享你的想法和经验。

3 个答案:

答案 0 :(得分:2)

我认为任何可以从关注点分离中受益的情况都会从IoC中受益。您在这里遇到的问题是如何在服务中使用MEF。是核心服务本身,还是服务执行的某些功能。

例如,如果要将服务注入到WCF服务中,可以使用与CodePlex上的MEF for WCF示例类似的内容。我没有太多关注它,但实质上它通过IInstanceProvider包装服务位置,允许您自定义服务类型的创建方式。不确定它是否支持构造函数注入(这是我的偏好)虽然......?

如果WCF服务组件是不是你希望使用MEF,您仍然可以利用MEF的创建服务所使用的组件的子集。最近对我工作的公司,我们一直在重建我们的报价单的过程,我已经建立了一个灵活的工作流计算模型,从而使工作流程单位是MEF组成部分,可以在需要的地方堵塞。这里的重要部分是管理您的CompositionContainer与WCF服务的生命周期相关的使用方式(例如Singleton行为等)。如果您决定每次创建一个新容器,这非常重要(容器创建非常便宜,而目录创建可能很昂贵)。

希望有所帮助。

答案 1 :(得分:1)

我正在研究一种解决方案,其中我希望在WCF调用中使用的MEF部分存储在应用程序级别的单例中。这全部托管在IIS中。这些服务的装饰与asp.net兼容。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

在Global.asax中,我导入了部件。

[ImportMany(typeof(IOption))]
public IEnumerable<IOption> AvailableOptions{ get; set; }

初始化目录和容器后,我将导入的对象复制到我的单例类。

container.ComposeParts(this);
foreach (var option in AvailableOptions)
    OptionRegistry.AddOption(option);

编辑:

我的注册表类:

public static class OptionRegistry
{
    private static List<IOption> _availableOptions= new List<IOption>();

    public static void AddOption(IOption option)
    {
        if(!_availableOptions.Contains(option))
            _availableOptions.Add(option);
    }

    public static List<IOption> GetOptions()
    {
        return _availableOptions;
    }
}

这样可行,但我想让它保持线程安全,所以我会在完成后发布该版本。

线程安全注册表:

public sealed class OptionRegistry
{

    private List<IOptionDescription> _availableOptions;
    static readonly OptionRegistry _instance = new OptionRegistry();

    public static OptionRegistry Instance
    {
        get { return _instance; }
    }


    private OptionRegistry()
    {
        _availableOptions = new List<IOptionDescription>();
    }


    public void AddOption(IOptionDescription option)
    {
        lock(_availableOptions)
        {
            if(!_availableOptions.Contains(option))
                _availableOptions.Add(option);
        }
    }

    public List<IOptionDescription> GetOptions()
    {
        return _availableOptions;
    }

}

答案 2 :(得分:0)

不久之前,我想知道如何创建一个WCF Web服务,它将使MEF连接其所有依赖项,但我不需要在我的服务类中编写一行该连线代码。

我还希望它完全基于配置,所以我可以将我的通用解决方案带到下一个项目,而无需进行代码更改。

我的另一个要求是我应该能够以简单的方式对服务进行单元测试并模拟其不同的依赖关系。

我想出了一个我在这里写博客的解决方案:Unit Testing, WCF and MEF

希望能帮助人们尝试做同样的事情。