在不使用 Entity Framework 的情况下跟踪对 Class 所做的更改
Tracking Changes done to a Class without using Entity Framework
我需要跟踪对复杂模型所做的任何更改(我必须说这是一个非常复杂的模型,具有各种关系)。一旦我确定了这些更改,我必须将它们保存到一个单独的 table 中,以便稍后由管理员批准。
我试过使用 Entity Framework 的更改跟踪器,甚至尝试对其进行自定义,但它一直给我一个又一个问题。
您建议我可以使用什么来跟踪这些不涉及 Entity Framework 的更改?
更新:我最终通过创建自己的自定义检查器解决了这个问题。花了更多时间,但最终更值得,因为我可以完全控制更改。
感谢您的意见,
史蒂夫:)
很抱歉没有提供代码示例。正如所评论的那样,这更像是一个想法(为本次交流提供广泛的支持),但这是我以前做过的一种高级方式。当 "reflection" 遭到高度反对时,我们称它为 "meta data" 但本质上使用了反射 - 因此,今天它被称为元编程。
您的问题是 元编程 的一个很好的用例。仅由于内存不足和限制 CPU,反射在“80 年代”曾经非常慢。
- 序列化,例如 JSON 使用反射或臭名昭著的慢速 XML(但不再使用)
- 依赖注入是元编程之母
- 像自动映射器这样的助手也大多是反射。
如今,它已经过高度优化,并且由于出色的计算能力而运行得非常好。只要您不编写骇人听闻的代码,或尝试进一步优化它,您就可以了。你应该相信框架和编译器。
您可以做一些奇特的事情,例如拦截更改,但这可能会变得非常复杂。为了让它更简单一点,你所要做的就是遵循一些 DDD
您的 classes 应该只允许通过您公开的属性进行更改。然后可以向每个改变状态的集合或操作发送您可爱的状态跟踪代码。
在 NET 4.5 中,反射非常快,元编程已经在整个节目的依赖注入中使用。
要记住更改,请使用优化的集合,例如字典或哈希集。取决于您的需要。使用 GetType
将其存储为键,值可以是新值,或者像 class 那样保存元数据。旧值、新值、版本(用于回滚)等
一旦你在你的 class 中实现了这一点,你就可以将所有逻辑转移到单例中,并定义一些你将在所有 "entities"
上重用的通用方法
我需要跟踪对复杂模型所做的任何更改(我必须说这是一个非常复杂的模型,具有各种关系)。一旦我确定了这些更改,我必须将它们保存到一个单独的 table 中,以便稍后由管理员批准。
我试过使用 Entity Framework 的更改跟踪器,甚至尝试对其进行自定义,但它一直给我一个又一个问题。
您建议我可以使用什么来跟踪这些不涉及 Entity Framework 的更改?
更新:我最终通过创建自己的自定义检查器解决了这个问题。花了更多时间,但最终更值得,因为我可以完全控制更改。
感谢您的意见,
史蒂夫:)
很抱歉没有提供代码示例。正如所评论的那样,这更像是一个想法(为本次交流提供广泛的支持),但这是我以前做过的一种高级方式。当 "reflection" 遭到高度反对时,我们称它为 "meta data" 但本质上使用了反射 - 因此,今天它被称为元编程。
您的问题是 元编程 的一个很好的用例。仅由于内存不足和限制 CPU,反射在“80 年代”曾经非常慢。
- 序列化,例如 JSON 使用反射或臭名昭著的慢速 XML(但不再使用)
- 依赖注入是元编程之母
- 像自动映射器这样的助手也大多是反射。
如今,它已经过高度优化,并且由于出色的计算能力而运行得非常好。只要您不编写骇人听闻的代码,或尝试进一步优化它,您就可以了。你应该相信框架和编译器。
您可以做一些奇特的事情,例如拦截更改,但这可能会变得非常复杂。为了让它更简单一点,你所要做的就是遵循一些 DDD
您的 classes 应该只允许通过您公开的属性进行更改。然后可以向每个改变状态的集合或操作发送您可爱的状态跟踪代码。
在 NET 4.5 中,反射非常快,元编程已经在整个节目的依赖注入中使用。
要记住更改,请使用优化的集合,例如字典或哈希集。取决于您的需要。使用 GetType
将其存储为键,值可以是新值,或者像 class 那样保存元数据。旧值、新值、版本(用于回滚)等
一旦你在你的 class 中实现了这一点,你就可以将所有逻辑转移到单例中,并定义一些你将在所有 "entities"
上重用的通用方法