我目前正在使用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。
三个问题:
答案 0 :(得分:2)
该观点不应该对NH有任何了解。不是它的责任。 NH会话应在服务级别或存储库级别处理。有一些变数和方法,事实就是这样:没有银弹。所有这些都取决于View的功能。
我建议查看unNHAddins(http://code.google.com/p/unhaddins/)处理NH和WPF的一些例子。
昨天我在这个答案中添加了更多信息: NHibernate in C# application, how to manage session
祝你好运!