在 ViewModels 之间传递 Realm 事务



注意:这与在 ViewController 之间传递 Realm 对象不同

我正在尝试找到一种方法在两个ViewModel之间传递 RealmTransaction。目前,Transaction在详细信息视图中打开,因此我只能在详细信息视图中访问它。我需要将其Dispose回主视图中,因此我认为我可以在导航到详细信息视图之前开始Transaction,如下所示:

var trans = realm.BeginWrite();
NavigationService.Navigate(typeof(DetailPage), trans);

但是,领域Transaction是不可序列化的,所以这个方法不起作用。我在 UWP 应用程序中使用 Template10。在 Xamarin 应用程序(快速日志示例(中,可以按如下方式完成此操作:

var transaction = realm.BeginWrite();
...
var page = new JournalEntryDetailsPage(new JournalEntryDetailsViewModel(entry, transaction));
Navigation.PushAsync(page);

据我所知,没有办法使用 Template10 的NavigationService将参数传递给构造函数。我很高兴能够:a( 将Transaction从主视图传递到构造函数中的详细信息视图,或者 b( 以某种方式从主视图访问详细信息视图的Transaction

我目前的解决方法是根本不使用Transaction,而是在详细信息视图中创建RealmObject的非托管副本,但这似乎不是一个很好的永久解决方案。

您可以实现穷人的注入缓存来解决序列化限制:

public static class Injector
{
private static readonly ConcurrentDictionary<Guid, object> _dict = new ConcurrentDictionary<Guid, object>();
public static Guid Store(object value)
{
var key = Guid.NewGuid();
_dict.TryAdd(key, value);
return key;
}
public static object Retrieve(Guid guid)
{
if (!_dict.TryRemove(guid, out var result))
{
throw new Exception("Key not found");
}
return result;
}
}

然后在主视图模型中,您可以执行以下操作:

var key = Injector.Store(realm.BeginWrite());
NavigationService.Navigate(typeof(DetailPage), key);

然后在您的详细视图模型中,您可以检索事务:

_transaction = Injector.Retrieve(key);

最新更新