1

我正在为我的程序使用IoC容器unity。在依赖工厂之间传递数据对象

我有多个链接工厂。一个调用下一​​个来创建一个它需要填充属性的对象。所有的工厂都使用相同的原始数据对象来构建它们各自的对象。原始数据对象描述了如何创建所有各种对象。目前,每个工厂都有一个Create方法,它接受一对参数来指定对象所代表的位置。

我的问题是如何将原始数据对象传递给每个工厂以便他们完成工作?

将对象注入到Create()方法中似乎比面向对象更程序化。但是,如果我将对象注入每个工厂的构造函数,那么我将如何正确解析每个工厂。更不用说这些工厂需要能够处理不同的原始数据对象。也许有更好的建筑?

下面表示我有的结构类型,减去任何地方的原始对象。

class PhysicalObjectFactory 
{ 
    private readonly StructureAFactory _structureAFactory; 
    private readonly Parser _parser; 

    public PhysicalObjectFactory(StructureAFactory structureAFactory, Parser _parser) 
    { 
     _structureAFactory = structureAFactory; 
     this._parser = _parser; 
    } 

    public PhysicalObject CreatePhysicalObject() 
    { 
     RawDataObject rawDataObject = _parser.GetFromFile("foo.txt"); 
     // do stuff 
     PhysicalObject physicalObject = new PhysicalObject(); 
     physicalObject.StructureA = _structureAFactory.Create(num1, num2); 
     // do more stuff 
     return physicalObject; 
    } 
} 

class StructureAFactory 
{ 
    private readonly StructureBFactory _structureBFactory; 

    public StructureAFactory(StructureBFactory structureBFactory) 
    { 
     _structureBFactory = structureBFactory; 
    } 

    public StructureA Create(int a, int b) 
    { 
     // do stuff 
     StructureA structureA = new StructureA(); 
     structureA.StructureB = _structureBFactory.Create(num76, num33); 
     // do more stuff 
     return structureA; 
    } 
} 

class StructureBFactory 
{ 
    public StructureBFactory(){} 

    public StructureB Create(int a, int b) 
    { 
     StructureB structureB = new StructureB(); 
     // do stuff 
     return structureB; 
    } 
} 

回答

1

我的问题是如何/我在哪里原始数据对象传递给每个 工厂,以便他们做好本职工作?

一般来说,您应该通过构造函数注入通过方法和编译时/设计时/配置数据传递运行时数据。

您的服务与其使用时间不同。这些服务可以存活很长时间,这意味着它们可以多次使用不同的运行时值。如果您在运行时间数据和在整个服务生命周期内不会更改的数据之间做出区分,那么您的选项会变得更加清晰。

所以问题是你传递的原始数据在每次调用时是否改变,或者是否是固定的。也许它是部分修复的。在这种情况下,你应该分开数据;只通过Create方法传递运行时数据。看起来显而易见的是,由于工厂是链接的,他们需要创建该部分对象的数据通过它们的Create方法传递给它们。

然而,有时候,你有一些介于两者之间的数据。它是在应用程序生命周期中将会更改的数据,但不希望通过方法调用将其传递,因为调用者无法确定这些值是什么。这是上下文信息。这方面的一个明显例子是关于正在执行请求的登录用户的信息。您不希望调用者(例如您的表示层)传递该信息,因为这是额外的工作,并且如果表示层忘记传递此信息或意外传递一些无效值,则可能存在安全风险。

在这种情况下,最常见的解决方案是注入一项服务,为消费者提供此信息。在用户信息的情况下,您将注入IUserContext服务,该服务包含UserNameUserId属性,或许是IsInRole(string)方法或类似的东西。这里的技巧是,用户信息不是注入到消费者中,而是允许访问这些信息的服务。换句话说,用户信息的检索是推迟的。这允许组合的对象图保持独立于这些上下文信息。这使得更容易编写和验证对象图。

+0

这使现在更有意义。我没有考虑到我的原始数据对象在设计时与运行时间方面的差异。我相信你最后一段的解决方案就是我需要的。我需要类似于中介模式的东西。提供原始数据对象的服务。我会做的。谢谢! – devinh64