2012-02-15 47 views
2

因此,这里是我的问题:入门的一类一组依赖的深度嵌套在依赖图

例如,考虑以下因素:

一个File有一组Classes,以及Imports

A Class具有一套Instance Methods,Static MethodsVariables

A Instance Method具有ParametersBody

Body has ... yadayada。

的问题,在面向对象的建模方式这当是Body可能需要很多具体的依赖于功能:

class Body { 
    ... 

    public Body(Dependency1, Dependency2, Dependency_n, ...) { } 

    ... 
} 

所有其他类不需要,运行。我在这里提出的问题是如何获得这些依赖关系到Body,而不必通过File,ClassInstanceMethod来传递所有这些依赖关系。

我可以创建一个BodyFactory,但问题仍然是一样的,我必须要通过BodyFactory通过FileClassInstanceMethod,如果我不缺什么。

如何解决这个问题,而不诉诸单身?

回答

4

Body实施IBody接口,让InstanceMethod只依赖于IBodyIEnumerable<IParameter>(如果我们假设C# - 在Java中它将是一个不同名称的集合接口,但原理将是相同的)。

重复的refactoring to Facade Services这个过程一直到Composition Root,在那里你可以再compose the entire object graph这样的:

File file = new File(
    new List<IClass> 
    { 
     new Class(
      new List<IInstanceMethod> 
      { 
       new InstanceMethod(
        new List<IParameter>(), 
        new Body(
         new Dependency1() 
         new Dependency2(), 
         new DependencyN())) 
      }, 
      new List<IStaticMethod>(), 
      new List<IVariable>()) 
    }, 
    new List<IImport>()); 
+0

麻烦的是,其实我是想拥有所有实例生成的逻辑在里面实例方法。从你的建议看来,人们会想要将实例化逻辑传递给组合根。我对吗? – 2012-02-15 15:10:09

+0

是的。 http://blog.ploeh.dk/2011/03/03/InjectionConstructorsShouldBeSimple.aspx – 2012-02-15 15:12:11

+0

与“撰写对象图有信心”麻烦的是,将在运行时创建的对象的数量是未知的。 – 2012-02-15 15:12:49

0

至于Java的来讲,我不认为你有一个解决办法在这里,如果一个方法需要n个参数,那么你将不得不通过他们,所以你将不得不携带他们所有的方式,使这更优雅的解决方案是创建一个DataWrapper,将其称为BodyBean并将其传递到一切。

然后你有其他选择不使用参数,那么如果这些人是单身,只是将它们注入,它的方式是选择我建议你