Re[11]: Model-View-Controller в .Net
От: IB Австрия http://rsdn.ru
Дата: 28.10.06 09:44
Оценка: 1 (1)
Здравствуйте, dotnetcoder, Вы писали:

D>дано ASP.NET 2.0 с SessionState = Server, надо реализовать MVP для WebApp:


D>Есть View — SomeUserControl (SomeUserControl.ascx)

D>Есть Presenter — C# Class
D>Есть Model — в данном случае XmlNode который возвращает WebService

Выглядеть это может примерно так:
Сначала описываем необходимые интерфейсы...
    public interface IMemento
    {
        // здесь описать всякие методы и свойства необходимые для идентификации 
        // и управления хранящемся объектом
        //
    }

     // интерфейс к сессии если вздумается хранить не в сессии, а в куках или во вьюстейте 
    // или вообще не хранить, если это десктоп приложение, достаточно подпихнуть нужную
    // реализацию этого интерфейса
    //
  public interface ISessionProvider
    {
        void Save(IMemento Memento);
        T Restore<T>() where T : IMemento; 
    }


Дальше пошли реализации.

  // хранитель данных модели
    //
    public class ModelMemento : IMemento
    {
        private XmlNode _node;

        public XmlNode Node
        {
            get { return _node; }
            set { _node = value;}
        }
    }

  // сама модель должна уметь сохраняться и восстанавливать свое состояние из Memento 
    //
    public class Model
    {
      .......
        
        public void Restore(ModelMemento Memento)
        {
            Node = ModelMemento.Node;
        }
        
        public IMemento Save()
        {
            ModelMemento memento = new ModelMemento();
            memento.Node = Node;
            return memento;
        }
    }


Теперь надо реализовать хранение мементо в сессии:

// в данном случае, для простоты, объекты хранятся по полному имени
//
public class SessionProvider : ISessionProvider
{
    private HttpSessionState _session =
        HttpContext.Current.Session;
    

    public void Save(IMemento Memento)
    {
        _session[typeof(T).FullName] = Memento;
    }

    public T Restore<T>() where T : IMemento
    {
        return (T) _session[typeof (T).FullName];
    }
}


Ну и осталось реализовать Presenter:

    public class Presenter
    {
        private Model _model = new Model();
        private IView _view;
        private ISessionProvider _session;

        // в конструкторе поддгружаем данные из сессии, если они там есть 
        // и восстанавливаем состояние модели
        //
        public Presenter(IView view, ISessionProvider session)
        {
            _session = session;
            ModelMemento modelMemento = _session.Restore<ModelMemento>();
            if (modelMemento != null)
                _model.Restore(modelMemento);
            
            _view = view;
      ....
        }
        
        // При изменении модели, сохраняем ее состояние в сессии.
        //
        private void OnModelChange(object sender, EventArgs e)
        {
       .....
            _session.Save(_model.Save());
        }
    }



D>Время жизни Presenter это время жизни Session

Нет. Presenter — это stateless объект, у него нет внутреннего состояния, которое надо хранить, он реализует лишь поведенческую логику. Зачем его запихивать в сессию?

D> (иначе Presenter придётся каждый раз создавать, что не есть хорошо)

Почему не хорошо? По умолчанию контроллером/презентером служит CodeBehind страничка, которая наследник Page, неужели ты и ее в сессию кладешь?
... [RSDN@Home 1.2.0 alpha rev. 619]
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.