【发布时间】: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。
三个问题:
- 有没有一种简单的方法来实现内存中的 ISessionFactory?
- 我应该尝试使用内存中的 SQLite 数据库吗?
- 我对整个事情采取了错误的方法吗?
【问题讨论】:
-
视图不应该对 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