Здравствуйте, 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]