在依赖工厂之间传递数据对象

本文关键字:数据 对象 之间 依赖 工厂 | 更新日期: 2023-09-27 17:55:07

我目前使用的是IoC容器unity。

我有多个连锁工厂。调用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;
    }
}

在依赖工厂之间传递数据对象

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

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

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

所以问题是你传递进来的原始数据在每次调用中是变化的还是固定的。也许它是部分固定的。在这种情况下,你应该把数据分开;只通过Create方法传递运行时数据。很明显,由于工厂是链接的,它们创建对象的那一部分所需的数据通过它们的Create方法传递给它们。

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

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