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

C# 在依赖工厂之间传递数据对象,c#,design-patterns,dependency-injection,inversion-of-control,unity-container,C#,Design Patterns,Dependency Injection,Inversion Of Control,Unity Container,我目前正在为我的程序使用IoC容器unity 我有多家连锁工厂。一个调用下一个来创建填充属性所需的对象。所有工厂都使用相同的原始数据对象来构建各自的对象。原始数据对象描述了如何创建所有不同的对象。目前,每个工厂都有一个Create方法,该方法接受两个参数来说明对象所代表的位置 我的问题是如何/在何处将原始数据对象传递给每个工厂,以便它们完成工作 将对象注入Create()方法似乎比面向对象更具过程性。但是,如果我将对象注入到每个工厂的构造函数中,那么我将如何正确解析每个工厂。更不用说这些工厂需要

我目前正在为我的程序使用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;
    }
}
我的问题是如何/在何处将原始数据对象传递给每个 工厂,以便他们做他们的工作

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

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

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

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


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

这现在更有意义了。对于我的原始数据对象,我没有考虑设计时与运行时的关系。我相信你在最后一段中的解决方案正是我所需要的。我需要类似于调解人模式的东西。提供原始数据对象的服务。我会这样做的。非常感谢。