C# 具有依赖关系的数据对象

C# 具有依赖关系的数据对象,c#,design-patterns,dependency-injection,unity-container,C#,Design Patterns,Dependency Injection,Unity Container,我试图找到一个存在的问题,但我不知道如何简洁地陈述它。目前我有一个对象集合,每个对象都有一个状态对象。状态对象本身具有三种状态。从外部数据源读入的原始状态、显示状态和输出状态。原始状态用于外部查找,以说明显示的状态应该是什么。显示的状态是用户可以更新的唯一状态。输出状态需要根据程序处于“可视模式”还是“非可视模式”而改变。我希望在显示的状态更新时进行此更改。以前,项目状态没有被抽象出来,项目只有一个状态。然后,我们对项目进行后处理,并将其状态更改为所需的输出状态。这需要9秒以上的时间来检查所有1

我试图找到一个存在的问题,但我不知道如何简洁地陈述它。目前我有一个对象集合,每个对象都有一个状态对象。状态对象本身具有三种状态。从外部数据源读入的原始状态、显示状态和输出状态。原始状态用于外部查找,以说明显示的状态应该是什么。显示的状态是用户可以更新的唯一状态。输出状态需要根据程序处于“可视模式”还是“非可视模式”而改变。我希望在显示的状态更新时进行此更改。以前,项目状态没有被抽象出来,项目只有一个状态。然后,我们对项目进行后处理,并将其状态更改为所需的输出状态。这需要9秒以上的时间来检查所有120000项并更新其输出状态。由于之前的重构,我现在已经抽象出了显示和输出状态,并希望进一步优化此输出状态转换。当然,我想在数据写入之前进行输出转换,但是数据写入到多个文件中,因此需要在多个位置进行此转换

示例:显示的状态正在更新为“坏”,因此,如果程序处于“视觉模式”,则输出状态需要更新为“好”。但如果程序处于“非可视模式”,则会设置为“坏”

所以我的问题是如何管理集合中数据对象所需的逻辑依赖关系?我曾想过使用依赖注入,但我可能不得不手动执行,而不是通过Unity的“魔力”。另外,如果只给一个新的Status对象一个起始状态,那么它看起来会很混乱。集合位于主对象内部,因此我确实考虑过在那里使用方法来管理集合,但这似乎有点严格,而且仅迭代和读取/更新状态对象更难

下面是类结构的表示:

class MyMapObject
{
    // This will have 100000+ items
    public Dictionary<Coordinate,Item> MapCollection { get; set; }
    /*
        Various other properties and methods
        ...
    */
}

class Item
{
    public ItemStatus Status { get; set;}
    /*
        Various other properties and methods
        ...
    */
}

class ItemStatus
{
    public State OriginalState { get; private set; }

    public State OutputState { get; private set; }

    public State ShownState 
    {
        get { return _shownState; }
        set
        {
            _shownState = value;
            SetOutputState();
        }
    }

    private void SetOutputState()
    {
        case DieState.Bad:   // How do I inject visualInspectionMode?
            OutputState = visualInspectionMode ? DieState.Good : DieState.Bad;
            break;
        // other states ...
    }
}
类MyMapObject
{
//这将有100000多个项目
公共字典映射集合{get;set;}
/*
各种其他性质和方法
...
*/
}
类项目
{
public ItemStatus状态{get;set;}
/*
各种其他性质和方法
...
*/
}
类项目状态
{
公共状态原始状态{get;private set;}
公共状态OutputState{get;private set;}
公共州ShownState
{
获取{return\u shownState;}
设置
{
_shownState=值;
SetOutputState();
}
}
私有void SetOutputState()
{
case DieState.Bad://如何注入visualInspectionMode?
OutputState=visualInspectionMode?DieState.Good:DieState.Bad;
打破
//其他国家。。。
}
}
状态对象本身具有三种状态。从外部数据源读入的原始状态、当前状态和输出状态

我们要考虑国家模式,所以这很麻烦。您将拥有状态对象,而不仅仅是
enum
属性。该模式允许恢复到以前的状态,但至少我们正在研究某种链表结构

CurrentState
vs
OutPutState
听起来像是在两次定义相同的状态。我最初的猜测是,我们想要构建一个
CurrentState
的状态对象,它将以“输出状态”的方式运行。也就是说,
OutputState
应该是一种方法

集合位于主对象内部,因此我确实考虑过在那里使用方法来管理集合,但这似乎有点严格,而且仅迭代和读取/更新状态对象更难

如果您真的想要控制集合,这实际上是很好的。这可以使对象的外观、感觉和行为类似于
主对象
,而不是通用的.net集合对象


我曾想过使用依赖注入,但我可能不得不手动执行,而不是通过Unity的“魔力”

每次对象更改状态时都使用
Unity
容器?听起来有点过分了。以及我从中理解的对DI容器概念的误用


另外,当通过给新的状态对象提供起始状态来构造新的状态对象时,它看起来很混乱

宾果

集合在主对象中,所以我确实想到了

首先设计状态机,然后再考虑集合

明确定义状态

错误
还是
非可视化模式
?它是
好的
还是
可视化模式
?首先,“好”和“坏”没有任何意义。第二步是定义状态,然后重新定义状态。对于
CurrentState
OutputState
似乎也是如此

明确定义动作->状态转换

  • 因此,应用程序变为可视会导致更改为
    可视
    状态
  • 状态模式,通常

  • 定义一个
    接口
    ,为导致状态更改的每个“操作”声明一个方法
  • 为每个状态编写一个具体的类并实现接口
  • 当某些事情发生时,我们改变状态,我们创建一个新的状态对象。对象的方法根据其状态进行操作。这就是所谓的
    OutputState
    可以完成其任务的时候
  • “操作”导致状态更改。应用程序从“可视”到“非可视”再到任何可以被认为是同一件事的东西


    目前我有一个对象集合,每个对象都有一个状态对象。状态对象本身具有三种状态

    我想这应该是一个单独的类。状态对象不仅仅是一群
    bool
    enum
    s,它是