【问题标题】:WCF with DI/IoC: Looking for a pattern [duplicate]带有 DI/IoC 的 WCF:寻找模式 [重复]
【发布时间】:2011-12-20 14:59:09
【问题描述】:

可能重复:
Injecting data to a WCF service

我有一个如下所示的 WCF 服务:(为清楚起见,省略了服务合同属性)

public interface IMyService
{
    void LoadBulkData(LoadRequest request);
}

public class MyService : IMyService
{
    IUnityContainer unity = new UnityContainer();
    IDataProvider provider;

    public MyService()
    {
        unity.LoadConfiguration();
        provider = unity.Resolve<IDataProvider>();
    }

    public void LoadBulkData(LoadRequest request)
    {
        // ...
    }
}

根据公司政策,Microsoft Unity 必须用于 DI/IoC。因为这是 WCF,所以我不能使用 构造函数注入,因为服务实现必须使用默认的无参数构造函数。

特别是,我不喜欢使用 Unity 来解决构造函数中的依赖关系。有没有人 知道解决这个问题的方法吗?另外,是否有一种模式可能更适合我的需求 在这里?

【问题讨论】:

  • 您可以构建自己的 SericeHostFactory 为您执行 DI/IoC。
  • 你有什么问题,我们在各种服务中使用了类似的东西,效果很好。
  • @ChrisBint - 问题在于,由于没有属性或构造函数注入,因此没有机会注入模拟进行测试。
  • 考虑到我正在单独测试每个部分,这点很好。
  • 我只想指出,你们公司的政策是愚蠢的。

标签: c# wcf design-patterns dependency-injection unity-container


【解决方案1】:

为什么不使用属性注入:

Annotating Objects for Property (Setter) Injection

【讨论】:

  • 这可能是我暂时要使用的。谢谢
  • 阅读那篇文章后的一个问题:“运行时”代码在哪里?服务的构造函数?
  • @ErOx - 我会看看这篇关于 WCF 可扩展性的文章并找出放置它的最佳位置:msdn.microsoft.com/en-us/magazine/cc163302.aspx
  • 属性注入意味着类的不变量与构造函数注入完全不同,所以我认为这不是一个好的解决方案——特别是当(与 OP 认为的相反)完全有可能支持构造函数时WCF 中的注入。
  • @Mark - 我的意思是 vanilla WCF 不支持开箱即用的带参数的构造函数。对于这些类型的构造函数,chris.house.00 的答案或在线提供的众多其他答案之一将是可行的方法。
【解决方案2】:

我自己的博客的无耻插件:)

http://thirteendaysaweek.com/2010/12/01/dependency-injection-and-wcf-services/

使用 WCF 和 Unity 进行构造函数注入实际上非常容易。您最终将需要一个自定义 ServiceHost、ServiceHostFactory、一个与您的容器交互的 IInstanceProvider 实现和一个 IServiceBehavior 实现。总而言之,它的代码并不多,而且相当容易理解。

【讨论】:

  • 其实你的博文很不错,谢谢。可能不是我这次会去的,时间限制等等,但我计划在未来回到这个。再次感谢您
【解决方案3】:

您可以使用 Ninject 和 WCF Ninject 扩展。 http://ninject.org/

【讨论】:

  • 抱歉,根据公司政策,我不能使用 Ninject。我在其他地方使用过 Ninject.Extensions.Wcf,效果很好。在一个更完美的世界里也许......
【解决方案4】:

This blogpost 描述了如何实现自定义 WCF IInstanceProvider

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多