Смешиваемость / MVVM для NHibernate - PullRequest
1 голос
/ 02 апреля 2011

В настоящее время я работаю над приложением WPF, использующим NHibernate в качестве своего уровня персистентности.Я пытаюсь использовать MVVM, частично для того, чтобы я мог использовать Blend для разработки своих элементов управления.

Я пытаюсь следовать примеру Айенде Рахиен в Effectus о наличии одной сессии IS на докладчика (кромев моем случае это модель представления вместо презентера).Моя модель представления выглядит примерно так:

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
        {
        }
    }
}

Что я хотел бы достичь, так это иметь ViewModelLocator, который работает с Unity для создания экземпляра модели представления времени разработки при работе в Blend (и модели обычного представления).при нормальном запуске программного обеспечения).Однако для создания экземпляра DesignMainWindowViewModel требуется * ISessionFactory во время разработки.

Три вопроса:

  1. Есть ли простой способ реализовать ISessionFactory в памяти?
  2. Должен ли я попытаться использовать базу данных SQLite в памяти?
  3. Я неправильно отношусь ко всему этому?

1 Ответ

2 голосов
/ 02 апреля 2011

Представление не должно ничего знать о NH. Разве это не ответственность. Сессия NH должна обрабатываться на уровне обслуживания или уровне хранилища. Есть много переменных и подходов, и правда в том, что нет серебряной пули. Все зависит от того, что делает View.

Я предлагаю рассмотреть некоторые примеры в unNHAddins (http://code.google.com/p/unhaddins/), касающиеся NH и WPF.

Я добавил больше информации в этот ответ вчера: NHibernate в приложении C #, как управлять сессией

Удачи!

...