На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> .NET Remoting
    Делаю 3-tier(layer) приложение. Есть в качестве уровней выбрал схему СУБД-BusinessObject(BO)-UI.
    BO запускаю с помощью сервера:
    ExpandedWrap disabled
      using System;
      using System.Runtime.Remoting;
      using System.Runtime.Remoting.Channels;
      using System.Runtime.Remoting.Channels.Tcp;
       
      namespace Test
      {
          public class Server
          {
              private const int SVPORT = 60000;
              private const string SVURI = "Test";
       
              public static void Main(string[] args)
              {
                  try
                  {
                      TcpChannel channel = new TcpChannel(SVPORT);
                      ChannelServices.RegisterChannel(channel, true);
       
                      RemotingConfiguration.RegisterWellKnownServiceType(
                          typeof(BusinessTier),
                          SVURI,
                          WellKnownObjectMode.SingleCall);
       
                      Console.WriteLine("Server started on port " + SVPORT);
                  }
                  catch (Exception e)
                  {
                      Console.WriteLine(e);
                  }
       
                  Console.WriteLine("Press enter to exit...");
                  Console.ReadLine();
              }
          }
      }


    Проблема:
    Когда UI вызывает метод BO, создается новый экземпляр BO (для каждого вызова метода!!!). А нужно чтобы для каждого UI создавался один BO (при подключении к серверу), который будет существовать до тех пор, пока UI его не уничтожит (т.е закроет соединение).

    Похоже на работу клиентов через терминалы, вся логика выполняется в BO который подключен к БД, а UI подключен к BO и вызывает методы - получает результаты.

    Например UI code:

    obj=(SomeObj)GetObject(...) // подключились и получили экземпляр BO
    obj.OpenDbConn(username, pass);
    obj.do_something1();
    ...
    obj.do_something2();
    obj.CloseDbConn(); // больше BO не нужен

    Как реализовать?
      Поменять WellKnownObjectMode.SingleCall на WellKnownObjectMode.Singleton?
        WellKnownObjectMode.Singleton не подходит т.к создает один объект для всех, а нужно - один объект на одного клиента UI.

        Пока вижу 3 варианта:
        -Не использовать Remoting, сделать все вручную (очень много писать :))
        -Создать Singleton и вручную управлять объектами клиентов
        -Запустить несколько серверов с Singleton
          Вопрос2: Запускается сервер, клиент получает объект, почему при остановке сервера не вызывается деструктор объекта? Как клиенту определить что соединение разорвано или сервер не работает?

          Вот код сервера для создания Client Activated Object:
          ExpandedWrap disabled
            using System;
            using System.Runtime.Remoting;
            using System.Runtime.Remoting.Channels;
            using System.Runtime.Remoting.Channels.Tcp;
             
            namespace Test
            {
                public class Server
                {
                    private static int mPort = 60000;
             
                    public static void Main(string[] args)
                    {
                        try
                        {
                            ChannelServices.RegisterChannel(new TcpChannel(mPort), true);
                            RemotingConfiguration.RegisterActivatedServiceType(typeof(BusinessTier));
                            Console.WriteLine("Server started on port " + mPort);
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e);
                        }
             
                        Console.WriteLine("Press enter to exit...");
                        Console.ReadLine();
                    }
                }
            }
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0201 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:02 GMT ]