【问题标题】:passing Realm transaction between ViewModels在 ViewModel 之间传递 Realm 事务
【发布时间】:2017-08-10 17:42:36
【问题描述】:

注意:这和Passing Realm objects between ViewControllers不一样

我正在尝试找到一种在两个ViewModels 之间传递领域Transaction 的方法。目前Transaction是在详细视图中打开的,所以我只能在详细视图中访问它。我需要 Dispose 将它返回到主视图中,所以我想我可以在导航到详细视图之前开始 Transaction,如下所示:

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

但是,Realm Transaction 是不可序列化的,所以这个方法不起作用。我在 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 的非托管副本,但这似乎不是一个很好的永久解决方案。

【问题讨论】:

    标签: c# uwp realm template10


    【解决方案1】:

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

    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);
    

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

    _transaction = Injector.Retrieve(key);
    

    【讨论】:

    • 非常感谢!今晚当我有我的项目时,我会试一试。我试图想出一种方法来传递Transaction 而不传递Transaction 对象本身,但没有找到任何方法来“找到”在Realm 中打开的Transaction。这看起来应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2014-05-04
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2014-01-30
    • 2013-11-30
    相关资源
    最近更新 更多