c# - 防止对象进入某种状态后被更改? (C#)

标签 c# oop domain-driven-design

我有一个以前从未真正处理过的用例。我有一个对象,在用户单击“保存”后不应更改。最初,我创建了两个对象:DraftObjectSavedObject。对于后者,我创建了一个仅接受 DraftObject 并将每个属性设置为 protected 集的构造函数。

这可行,但似乎并不理想。看来我应该能够在我的对象上设置一个属性来控制其他字段是否可编辑。最好的方法是什么?请原谅我的伪代码,但这就是我正在玩弄的:

public class MySpecialObject {
        public virtual string MyProperty { get { return MyProperty; } 
            set {
                if (State == "Locked")
                {
                    return;
                } else
                {
                    MyProperty = MyProperty;
                }
            }
         public virtual string State { get { return State; }
            set {
                 if (State == "Locked")
                 {
                     return;
                 } else
                 { 
                   State = State;
                 }
            }

这看起来很难看,特别是如果我必须对类(class)中的每个属性都执行此操作。一定有更好的方法来做到这一点,有什么想法吗?

最佳答案

这实际上是一个相当有趣的问题,因为对于不可变的对象,或者开始可变但可以被锁定以变得不可变的对象,有很多话要说。

具体解决您的问题,我认为如果尝试设置锁定的属性,则抛出 InvalidOperationException 可能更有意义。我不知道有什么更干净或更好的方法。

编辑

在一篇并行文章中,JLWarlow 指出,这正是当您调用 MakeReadOnlySecureString 的工作原理。 .

关于c# - 防止对象进入某种状态后被更改? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3416516/

相关文章:

c# - 基于属性的 webapi2 路由为某些方法返回 404

c# - 发送 16 位数字到 SQL 数据库

JavaScript:好的部分——如何完全不使用 `new`

c# - 持续无知领域层

c# - API设计问题

c# - 如何正确实现多个 Vector3.Lerps 串联?

c# - RegEx a* 是否匹配所有字符串?

javascript - 如何正确使用socket.io和oop

php - 如何实现根据用户尝试保存的值而变化的权限系统?

c# - 工厂模式应该放在 DDD 中的什么位置?