我有一个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();
}
这允许每个“路径”显示它所需的依赖关系,但是,这使得编写单元测试变得更加困难。有没有人有什么建议?启动所有依赖项有多大问题?在第一个进入服务的入口点后,通过构造函数注入依赖项是有意义的,但在第一个入口点,建议的方法是什么?
答案 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)
我不知道你在做什么的细节,但将它们分解成单独的服务可能更有意义。