1

Тема: Як в класі з dll дістати змінні програми, котра її використовує?

Значить, вся система складається з клієнта, сервера, та двох dll. Одна dll містить класи, котрі працюють з класами другої dll. Виглядає це приблизно так.

IFormatter formatter = new BinaryFormatter();
                        IClientData command = (IClientData)formatter.Deserialize(new MemoryStream(client.buffer)); // отримуємо  клас з даними від клієнта - запит
                        IServerData result1 = new SuperExecutor().Executor(command);//передаємо цей клас в метод класу, котрий його якимось чином обробить, та поверне інший клас - відповідь (класи запит та відповідь знаходяться в одній dll, а клас обробник - в іншій dll)
                        MemoryStream ms = new MemoryStream();
                        formatter.Serialize(ms,result1);
                        client.buffer = ms.GetBuffer();
                        client.socket.Send(client.buffer, 0, ms.GetBuffer().Length, SocketFlags.None);//відправляємо клас-відповідь клієнту


А що, якщо мені треба якось обробити дані, котрі приходять не від клієнта, а котрі вже описані в програмі, котра виконує роль серверу? Я ж вже не зможу передати їх в клас-обробник, хіба що обернути дані в клас, котрий успадкований від інтерфейсу IClientData, але ж потім йде обов'язкова відправка класа-відповіді клієнту, а що, якщо нічого клієнту відправляти не треба?

2

Re: Як в класі з dll дістати змінні програми, котра її використовує?

Ой, слухайте, про обгортку даних в клас, котрий наслідується від IClientData я пожартував, можна було просто змінити метод Executor в класі SuperExecutor, щоб він приймав не об'єкт типу IClientData, а Object, тому що всеодно ми приводимо дані до необхідного типа за допомогою dynamic

 public class SuperExecutor
    {
        public IServerData Executor(Object data)
        {
            dynamic var = data;
            return Execute(var);
        }

        private IServerData Execute(LoginData data)
        {
            return new LoginExecutor(data).Execute();
        }

        private IServerData Execute(ExampleData data)
        {
            return new ExampleExecutor(data).Execute();
        }

        private IServerData Execute(ForceLoginData data)
        {
            return new ForceLoginExecutor(data).Execute();
        }

        private IServerData Execute(GettingCharsData data)
        {
            return new GettingCharsExecutor(data).Execute();
        }

        private IServerData Execute(GetMaxCharsData data)
        {
            return new GettingMaxCharNumberExecutor(data).Execute();
        }

        private IServerData Execute(CreateCharData data)
        {
            return new CreateCharExecutor(data).Execute();
        }

        private IServerData Execute(DeleteCharData data)
        {
            return new DeleteCharExecutor(data).Execute();
        }
    }

але я тут зрозумів, що я не знаю як саме передати ці дані в цей метод, тому що ж воно працює отак - прийшли дані від клієнта і саме їх ми передаємо в метод Executor. А треба передати не клієнтські дані, а дані, котрі просто знаходяться на сервері та котрі клієнт передати ніяк не може.

3

Re: Як в класі з dll дістати змінні програми, котра її використовує?

ох, зробив так. В інтерфейс IServerData додав метод, котрий по дефолту повертає true, і перед відправкою класу-відповіді просто веревіряю, якщо цей метод повертає true, то выдправляю клас, а якщо false, то нэ.

4

Re: Як в класі з dll дістати змінні програми, котра її використовує?

коротше, перемістив SuperExecutor з dll до серверу, тепер в тій dll взагалі немає сенсу, і при доданні нової команди чи ще чогось, прийдеться перекомпільовувати весь сервер.....