0

考虑以下内容:

public class DependencyA {}
public class DependencyB {}
public class DependencyC {}
public class DependencyD {}

public class Service1
{
    public Service1(DependencyA a, DependencyB b, DependencyC c, DependencyD d) { ... }
}
public class Service2
{
    public Service2(DependencyA a, DependencyB b, DependencyC c, DependencyD d) { ... }
}
public class Service3
{
    public Service3(DependencyA a, DependencyB b, DependencyC c, DependencyD d) { ... }
}

我发现我的许多服务都依赖于多个通用组件,并且正在考虑实现如下所示的全部解决方案(全部通过 Windsor 连接)以节省服务构造函数中的代码重复。

public class DependencyContainer
{
    public DependencyA A { get; set; }
    public DependencyB B { get; set; }
    public DependencyC C { get; set; }
    public DependencyD D { get; set; }
}

public class Service1
{
    public Service1 (DependencyContainer container) { ... }
}

或者,我可以创建一个 ServiceBase 类。

public class ServiceBase
{
    public DependancyA A { get; set; }
    public DependancyB B { get; set; }
    public DependancyC C { get; set; }
    public DependancyD D { get; set; }
}

public class Service1 : ServiceBase {}

真正的问题是,这是否突出了服务中更广泛的设计问题?

也许我把 DI 走得太远了,但这些都是真正的依赖。

如果是这样,我该如何解决这个问题?如果不是,建议的解决方案是实现这一目标的有效方法吗?

4

2 回答 2

1

如果没有更广泛的背景,很难谈论这个问题,但您可能正在处理过于细粒度的依赖关系。这四个依赖项是否属于一起?它们作为一个有凝聚力的整体有意义吗?

如果是这样,您的方法非常有效。

如果没有,您的架构可能会碰壁。您可能以这样一种方式划分了您的域,即应该将责任放在一个或多个(隐式存在的)实体中,附加到其他实体。在这种情况下,您应该查看您的域并尝试识别这些重复出现的隐式实体,使它们显式并将行为移入其中。然而,这是一个更难的问题,并且非常特定于您的域和应用程序。

而且和IoC无关

于 2009-05-13T11:08:05.827 回答
1

对你的服务有太多的依赖可能表明你的服务做了太多的事情。换句话说,它可能违反了单一责任原则。

于 2009-05-13T14:02:57.663 回答