在从属工厂之间传递数据对象

时间:2014-03-29 22:03:57

标签: c# design-patterns dependency-injection inversion-of-control unity-container

我目前正在为我的程序使用IoC容器统一。

我有多个连锁工厂。一个调用next来创建一个填充属性所需的对象。所有工厂都使用相同的原始数据对象来构建各自的对象。原始数据对象描述了如何创建所有各种对象。目前,每个工厂都有一个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 个答案:

答案 0 :(得分:1)

  

我的问题是如何/在哪里将原始数据对象传递给每个   工厂为了让他们做好自己的工作?

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

您的服务在不同的时刻组成,就像使用它们一样。这些服务可以存活很长时间,这意味着它们可以使用不同的运行时值多次。如果您对运行时数据和在服务的整个生命周期内不会发生变化的数据进行区分,那么您的选择就会变得更加清晰。

所以问题在于,您传入的原始数据是否在每次通话时都在变化,或者是否已修复。也许它是部分修复的。在这种情况下,您应该分开数据;仅通过Create方法传递运行时数据。很明显,由于工厂是链接的,因此创建对象部分所需的数据将通过Create方法传递给它们。

但有时候,您之间会收到一些数据。数据将在应用程序的生命周期内发生变化,但不希望通过方法调用传递它,因为它不能由调用者决定这些值是什么。这是上下文信息。一个明显的例子是有关正在执行请求的登录用户的信息。您不希望调用者(例如您的表示层)传递该信息,因为这是额外的工作,如果表示层忘记传递此信息或意外传递某些无效信息,则存在潜在的安全风险值。

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