【问题标题】:Passing a Data Object Between Dependent Factories在依赖工厂之间传递数据对象
【发布时间】:2014-03-29 22:03:56
【问题描述】:

我目前正在为我的程序使用 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;
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    一般情况下,您应该通过方法传入运行时数据,并通过构造函数注入传入编译时/设计时/配置数据。

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

    所以问题是,您传入的原始数据是在每次调用时都发生变化,还是固定不变。也许它是部分固定的。在这种情况下,您应该将数据分开;仅通过 Create 方法传递运行时数据。很明显,由于工厂是链式的,他们创建对象的那部分所需的数据通过他们的Create 方法传递给他们。

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

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

    【讨论】:

    • 现在更有意义了。对于我的原始数据对象,我没有考虑设计时与运行时的关系。我相信您在最后一段中的解决方案是我所需要的。我需要类似于中介模式的东西。提供原始数据对象的服务。我会做的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多