IOC容器 - WCF服务 - 我应该通过构造函数实例化所有依赖项吗?

时间:2011-05-04 12:56:04

标签: c# wcf inversion-of-control

我有一个WCF服务,它有一些不同的职责,但它为任何与我的代码交互的人提供了一个入口点。为了简单起见,我们假设有两种方法

    private IMethodAHelper _methodA;
    private IMethodBHelper _methodB;

    public MyService(IMethodAHelper methodA, IMethodBHelper methodB)
    {
      _methodA = methodA;
      _methodB = methodB;
    }

    public void MethodA() {
       _methodA.CallThis();
    }

    public void MethodB() {
       _methodB.CallThis();
    }

因为消费者只会因为一个原因(MethodA或MethodB)调用该服务,所以IOC容器会不必要地启动所有依赖项是一个问题吗?我想提供一个入口点,所以我不想拆分服务,但是当服务的每个使用者只需要一个子集时,启动所有依赖关系似乎有点浪费。

我想这样做的另一种方式就是

    public void MethodA() {
       var methodA = ObjectFactory.GetInstance<IMethodAHelper>();
       methodA.CallThis();
    }

这允许每个“路径”显示它所需的依赖关系,但是,这使得编写单元测试变得更加困难。有没有人有什么建议?启动所有依赖项有多大问题?在第一个进入服务的入口点后,通过构造函数注入依赖项是有意义的,但在第一个入口点,建议的方法是什么?

4 个答案:

答案 0 :(得分:5)

您应该坚持使用构造函数注入,而不必担心构造开销。 It's very rarely an issue, and if it is, there are elegant ways to deal with it

答案 1 :(得分:2)

作为Mark sais,你不应该担心创建未使用的依赖项,除非你有一些实际的prof(来自profiler的时间),它们的创建成本很高。如果您有一些昂贵的创建组件,您可能希望使用支持惰性注入的容器,如AutoFac。这样你可以注入Lazy,只有在第一次使用时才会构建它。

答案 2 :(得分:2)

答案 3 :(得分:1)

我不知道你在做什么的细节,但将它们分解成单独的服务可能更有意义。