我目前正在使用NHibernate作为持久层的WPF应用程序上工作。我正在尝试部分使用MVVM,以便可以使用Blend来帮助设计控件。
我尝试遵循Effectus中Ayende Rahien的示例,即每个演示者只有一个ISession(在我的情况下,这是一个 View 模型而不是演示者)。我的 View 模型如下所示:
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中工作时实例化设计时 View 模型(在正常运行软件时实例化常规 View 模型)。但是,我需要一个设计时ISessionFactory来实例化DesignMainWindowViewModel。
三个问题:
最佳答案
该 View 不应对NH有任何了解。不是它的责任。
NH session 应在服务级别或存储库级别处理。有很多变数和方法,事实是这样:没有 Elixir 。所有取决于View的功能。
我建议查看unNHAddins(http://code.google.com/p/unhaddins/)中有关NH和WPF的一些示例。
我昨天在此答案中添加了更多信息:
NHibernate in C# application, how to manage session
祝你好运!
关于wpf - NHibernate的可共混性/MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5524707/