【问题标题】:Blendability / MVVM for NHibernateNHibernate 的可混合性/MVVM
【发布时间】:2011-04-03 01:38:48
【问题描述】:

我目前正在开发一个使用 NHibernate 作为我的持久层的 WPF 应用程序。我正在尝试使用 MVVM,部分原因是我可以使用 Blend 来帮助设计我的控件。

我正在尝试遵循 Ayende Rahien 在Effectus 中的示例,即每个演示者有一个 ISession(在我的情况下,它是一个视图模型而不是演示者)。我的视图模型如下所示:

public abstract ViewModelBase : INotifyPropertyChanged
{
    private readonly ISessionFactory _sessionFactory;

    protected ViewModelBase(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
    }

    private ISession Session
    {
        get
        {
            if (_session == null)
            {
                _session = _sessionFactory.OpenSession();
            }
            return _session;
        }
    }
    private ISession _session;

    // INotifyPropertyChanged implementation here...
}

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel(ISessionFactory sessionFactory)
        : base(sessionFactory)
    {
        var rep = new ProductRepository(this.Session);
        this.Products = new ObservableCollection<Product>(rep.GetAll());
    }

    public ObservableCollection<Product> Products
    {
        get
        {
            return _products;
        }
        set
        {
            if (_products != value)
            {
                _products = value;
                RaisePropertyChanged("Products");
            }
        }
    }
    private ObservableCollection<Product> _products;
}

public class DesignMainWindowViewModel : MainWindowViewModel
{
    public DesignMainWindowViewModel(ISessionFactory sessionFactory)
        : base(sessionFactory)
    {
    }

    public new ObservableCollection<Product> Products
    {
        get
        {
            List<Product> products = new List<Product>();
            // fill in design-time products...
            return products;
        }
        set
        {
        }
    }
}

我想要实现的是拥有一个与 Unity 一起使用的 ViewModelLocator,以便在 Blend 中工作时实例化设计时视图模型(以及在正常运行软件时的常规视图模型)。但是,我需要一个设计时 ISessionFactory 来实例化 DesignMainWindowViewModel。

三个问题:

  1. 有没有一种简单的方法来实现内存中的 ISessionFactory?
  2. 我应该尝试使用内存中的 SQLite 数据库吗?
  3. 我对整个事情采取了错误的方法吗?

【问题讨论】:

  • 视图不应该对 NH 有任何了解。
  • 视图什么都不知道。我是 NHibernate 的新手,但我读到最好的做法是每个演示者有一个 ISession,我认为每个视图模型都有一个 ISession。你还有什么建议?
  • ViewModelBase 中的 ISession 属性会在 NH 和视图之间创建依赖关系。我不认为这是正确的。
  • 我查看了您链接到的 Ayende 的文章,在他的示例中,他使用了一种称为 Model-View-Presenter 的模式。如果您下载他提供的代码示例并查看 AbstractPresenter,您将看到我的代码所基于的示例。在 Ayende 对 MVP 的使用中,每个 Presenter 都有自己的 ISessionFactory。这正是我正在做的,除了我有一个视图模型(同样,它不是视图)而不是演示者。您是否碰巧知道有人在 WPF 或 Silverlight 应用程序中使用设计时 DataContext 的示例,该应用程序使用 NHibernate 进行持久性?
  • 我不确定设计时的事情,但我们正在使用以下方法完成一个 Winforms/WPF 混合应用程序。我们有一个名为 BaseModel 的基类,它基本上以与 ViewModelBase 类似的方式处理 NH 会话。 ViewModel 知道这个 BaseModel 类。 BaseModel 的生命周期与 ViewModel 相关联(如果用户关闭表单,则处置 ViewModel,从而处置 BaseModel 及其会话)。基本上,我们在您的架构中稍微降低了您的方法。无论如何,没有灵丹妙药。

标签: wpf nhibernate mvvm expression-blend design-time


【解决方案1】:

视图不应该对 NH 有任何了解。不就是责任吗。 NH 会话应在服务级别或存储库级别处理。有许多变量和方法,事实是:没有灵丹妙药。所有这一切都取决于 View 正在做什么。

我建议查看 unNHAddins (http://code.google.com/p/unhaddins/) 中处理 NH 和 WPF 的一些示例。

我昨天在这个答案中添加了更多信息: NHibernate in C# application, how to manage session

祝你好运!

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多