Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.192.53.34] |
|
Сообщ.
#1
,
|
|
|
Делаю 3-tier(layer) приложение. Есть в качестве уровней выбрал схему СУБД-BusinessObject(BO)-UI.
BO запускаю с помощью сервера: 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 не нужен Как реализовать? |
Сообщ.
#2
,
|
|
|
Поменять WellKnownObjectMode.SingleCall на WellKnownObjectMode.Singleton?
|
Сообщ.
#3
,
|
|
|
WellKnownObjectMode.Singleton не подходит т.к создает один объект для всех, а нужно - один объект на одного клиента UI.
Пока вижу 3 варианта: -Не использовать Remoting, сделать все вручную (очень много писать ) -Создать Singleton и вручную управлять объектами клиентов -Запустить несколько серверов с Singleton |
Сообщ.
#4
,
|
|
|
Вопрос2: Запускается сервер, клиент получает объект, почему при остановке сервера не вызывается деструктор объекта? Как клиенту определить что соединение разорвано или сервер не работает?
Вот код сервера для создания Client Activated Object: 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(); } } } |