Здравствуйте, rsn81, Вы писали:
R>Здравствуйте, dotnetcoder, Вы писали:
D>>... на клиенте. Вот вы тут все вумными словами кидаетесь, прошу, покажите мне реализацию (code) хоть Memento хоть SessionProvider хоть ViewState применительно к ASP.NET когда SessionState=Server
R>Прошу прощения, но не понял просьбы. Как бы какая-то "закавыка" в просьбе присутствует, вот только не пойму, в чем она?
R>Если серьезно, то пример кода в документации несложно найти.
Хорошо, давайте рассмотрим конкретный пример :
дано ASP.NET 2.0 с SessionState = Server, надо реализовать MVP для WebApp:
Есть View — SomeUserControl (SomeUserControl.ascx)
Есть Presenter — C# Class
Есть Model — в данном случае XmlNode который возвращает WebService
Для того что бы View дёргла Presenter ссылку на её надо, как предложил автор статьи, хранить в Presenter.
public class Presenter
{
private Model _model = new Model();
private IView _view;
}
Время жизни Presenter это время жизни Session (иначе Presenter придётся каждый раз создавать, что не есть хорошо) соответственно Session хорошее место для его хранения (а в ViewState его засовывать это вообще бред

) но в вышеуказанной конфигурации реализация MVP усложняется, тем что приходится лепить костыли для хранения Presenter в памяти.
Я реализовал MVP для вышеуказанной конфигурации и оно работает, так что это трудности не составляет, но вдруг окажется что есть более лучшие варианты
Сильно упрощённо, моя схема была примерно такая :
public interface IView
{
IPresenter Controller
ViewCallBackHandler(ControllerCommandBase command)
}
public interface ICommand
{
}
public interface IPresenter
{
void OnCommand(IView view, ICommand command); //command = class ViewCommandBase : ICommand
}
public interface IService
{
XmlNode GetData(ControllerCommandBase command) // command = class ControllerCommandBase : ICommand
}
public class SomePresenter : IPresenter
{
public virtual void OnCommand(IView view, ICommand command)
{
if ( command is SomeViewCommand) CommandHandler(view, command as SomeViewCommand)
}
public virtual ControllerCommandBase MapCommand(ViewCommandBase viewCommand)
{
return commandTable[viewCommand];
}
public void CommandHandler(IView view, SomeViewCommand command)
{
ConcreteControllerCommand cmd = MapCommand(command);
SomeDate data = Service.GetData(cmd);
view.ViewCallBackHandler(new AnotherControllerCommand("Refresh",new ControllerEventArgs(data)))
}
public IService Service
{
get{ return ServiceFactory.GetService(); }
}
}
ControllerManager лежит в Application и создается по Application_Start (дада, лочим конечно

), и держит в себе control_id И ссылку на IPresenter который создаётся в IPresenter Controller по Singleton и добавляется при первом вызове get в ControllerManager. ControllerManager реализует IDisposable и уничтожается по Application_End .