gpt4 book ai didi

c# - 使用多层 MVVM 处理 TreeView 中的数据库事务和异常

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:08 25 4
gpt4 key购买 nike

背景:
我有一个基于 WPF TreeView 的自定义用户控件。我一直在使用 MVVM 模式并拥有一个基本 View 模型 TreeNode 类和几个派生 View 模型,例如 LocationNode、LocationFolder、PersonNode、PersonFolder、CollectionNode、CollectionFolder 等。

树的布局示例如下:


- CollectionFolder
--> CollectionNode
--> LocationFolder
-->LocationNode
-->LocationNode
--> PersonFolder
-->PersonNode
--> CollectionNode
--> CollectionNode
+ CollectionFolder
+ CollectionFolder

当我执行拖放操作时,每个类都会处理业务逻辑,即如果我将 PersonNode 拖放到 CollectionNode 上,则 CollectionNode View 模型包含如何将 PersonNode 添加到其子 PersonFolder 的逻辑。

问题:
一切都很好,我可以到处拖放,代码很好地包含在派生类中。如果我需要添加额外的放置规则,我将其添加到适当的放置目标 View 模型中。

问题是当 PersonNode 添加到 PersonFolder 时,我需要创建一个新的数据库条目以反射(reflect)底层 Person 模型现在也在一个新的 Collection 中。

目前,树中的每个 View 模型都可以访问当前数据库 session /事务,并可以执行插入/保存。但这使得捕获异常和错误非常重复,我的异常处理代码在我的整个 View 模型中都是重复的。 MVVM 中是否有更好的方法来处理我的数据库交互?

我的 PersonFolder 中的 Drop 事件的代码片段>


// Create a new view model for the Person and add it to my children
_children.Add( new PersonNode( droppedPerson ) );

// Create a new entry in the collection for this person
CollectionEntry entry = new CollectionEntry();
entry.Entity = droppedPerson;
entry.Collection = _collection;

// Save the new entry
using( var transaction = _uow.BeginTransaction( IsolationLevel.Serializable ) )
{
// Add the entry to the session
_uow.Add( entry );

// Save the session
_uow.SaveChanges(); // [1]

// Commit transaction
transaction.Commit(); // [2]
}

[1] 和 [2] 有可能抛出异常,应该在 try/catch 语句中处理。但是,我不想在我所有的 View 模型中重复我所有的异常处理,有什么建议吗?

我想我总是可以实现一个单例来包含 session 和异常处理并将我的新实体传递给它?

最佳答案

我假设你最后一个代码块的变量部分是:

_uow.Add( entry );

...所以在某些情况下,您可能实际上希望在该位置发生更多或更少的 Action 。

我认为这是“Hole in the Middle Pattern”的一个很好的候选者。

基本上只是传递一个

Action<T>

到打开事务的其他地方(Singleton 等),将上下文 (_uow) 传递给您的操作,然后提交事务,并处理所有异常逻辑。您的代码如下所示:


// Create a new view model for the Person and add it to my children
_children.Add( new PersonNode( droppedPerson ) );

// Create a new entry in the collection for this person
CollectionEntry entry = new CollectionEntry();
entry.Entity = droppedPerson;
entry.Collection = _collection;

someSingleton.Execute(o => o.Add(entry));

关于c# - 使用多层 MVVM 处理 TreeView 中的数据库事务和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com