NHibernate的Blendability / MVVM

时间:2011-04-02 17:30:31

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

我目前正在使用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. 我对整个事情采取了错误的方法吗?

1 个答案:

答案 0 :(得分:2)

该观点不应该对NH有任何了解。不是它的责任。 NH会话应在服务级别或存储库级别处理。有一些变数和方法,事实就是这样:没有银弹。所有这些都取决于View的功能。

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

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

祝你好运!