在 ViewModel 之间传递 Realm 事务
passing Realm transaction between ViewModels
注意:这与
不同
我正在尝试找到一种在两个 ViewModel
之间传递领域 Transaction
的方法。目前,Transaction
是在详细视图中打开的,所以我只能在详细视图中访问它。我需要 Dispose
它回到主视图,所以我想我可以在导航到详细视图之前开始 Transaction
,就像这样:
var trans = realm.BeginWrite();
NavigationService.Navigate(typeof(DetailPage), trans);
但是,一个RealmTransaction
是不可序列化的,所以这个方法是行不通的。我在 UWP 应用程序中使用 Template10。在 Xamarin 应用程序(QuickJournal 示例)中,这可以像这样完成:
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;
}
}
然后在你的主 ViewModel 中你可以做:
var key = Injector.Store(realm.BeginWrite());
NavigationService.Navigate(typeof(DetailPage), key);
然后在您的详细 ViewModel 中,您可以检索事务:
_transaction = Injector.Retrieve(key);
注意:这与
我正在尝试找到一种在两个 ViewModel
之间传递领域 Transaction
的方法。目前,Transaction
是在详细视图中打开的,所以我只能在详细视图中访问它。我需要 Dispose
它回到主视图,所以我想我可以在导航到详细视图之前开始 Transaction
,就像这样:
var trans = realm.BeginWrite();
NavigationService.Navigate(typeof(DetailPage), trans);
但是,一个RealmTransaction
是不可序列化的,所以这个方法是行不通的。我在 UWP 应用程序中使用 Template10。在 Xamarin 应用程序(QuickJournal 示例)中,这可以像这样完成:
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;
}
}
然后在你的主 ViewModel 中你可以做:
var key = Injector.Store(realm.BeginWrite());
NavigationService.Navigate(typeof(DetailPage), key);
然后在您的详细 ViewModel 中,您可以检索事务:
_transaction = Injector.Retrieve(key);