【问题标题】:Object creation events in ServiceStack's OrmLiteServiceStack 的 OrmLite 中的对象创建事件
【发布时间】:2013-09-21 05:29:08
【问题描述】:

我需要在由 OrmLite 实例化的对象上设置一个事件处理程序,并且除了访问 repo 中的每个 Get 方法(这显然不是一个好方法)之外,我想不出一个好的方法来做到这一点。

提供一些背景信息 - 假设我有一个从数据库中提取的 User 类;它还实现了 INotifyPropertyChanged。我想为该事件分配一个处理程序。从 Funq 自动填充它是理想的,但当然 OrmLite 不会要求 Funq 水合新对象。

所以我被卡住了。

任何正确方向的提示将不胜感激。

【问题讨论】:

  • 使用构造函数是否有某些原因不起作用?
  • 如果构造函数不起作用,我认为你最好使用另一个 ORM。 OrmLite 的设计并没有真正考虑到这种可扩展性。
  • 构造函数不起作用,因为他们不应该知道事件处理程序。理论上我可以对处理程序进行硬编码,但这在许多层面上都是一个糟糕的选择。
  • 一般来说,我同意演员“应该”不了解事件处理程序。但在这种情况下,它可能只是解决您的问题的方法。如果您绝对不能走那条路,我建议您使用另一个 ORM 解决方案。 OrmLite 被设计为尽可能轻量级。

标签: servicestack ormlite-servicestack


【解决方案1】:

在我看来,您将表示逻辑与数据访问逻辑混合在一起。如果我处于您的位置,我不会尝试在模型(例如您的 User 类)上实现INotifyPropertyChanged。相反,我会创建一个 ViewModel 并将数据绑定逻辑放在那里 (MVVM Style)。

在数据模型上使用INotifyPropertyChanged 并不完全合乎逻辑。例如,如果我要更新数据库记录,它不会触发此事件(但属性 已更改)。这在 ViewModel 上更有意义。

除了解决您的原始问题之外,它还允许您聚合、组合和过滤数据以用于显示目的,从而使构建复杂屏幕变得更加容易。如果您需要从数据库、RSS 提要、股票行情网络 API 和 twitter 中提取信息,您可以在 ViewModel 中进行。

public class User
{
    [AutoIncrement]
    public int Id { get; set; }

    public string Name { get; set; }
}

public class UserViewModel : INotifyPropertyChanged
{
    private string _name;

    public UserViewModel(User user)
    {
        _name = user.Name;
    }

    public string Name
    {
        get { return _name; }
        set {
            if (value == _name) return;
            _name = value;
            OnPropertyChanged("Name");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

小提示:这个答案是在使用 ViewModel 在屏幕上显示数据的上下文中编写的,但是,相同的概念适用于出于任何目的观察模型更改。

【讨论】:

  • 我遇到的问题不是 INotify 的实现(尽管在派生类而不是模型本身上实现它可能会更干净),而是在分配事件处理程序上。理想情况下,我会在 OrmLite 中有一个 OnObjectCreated 挂钩并使用它来操作对象;另一种选择是在 Get... 回购方法中分配它,这并不难或不一定是坏的,但感觉就像代码重复。我认为有时花一个小时进行研究以找到节省 15 分钟工作时间的方法是可以的 :)
  • 这实际上不再是一个要求,但问题仍然存在。我想如果我真的想要它,我只需要分叉 OrmLite 然后做一个拉取请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多