Re[10]: Model-View-Controller в .Net
От: dotnetcoder  
Дата: 27.10.06 18:39
Оценка:
Здравствуйте, 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 .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.