Как скрыть лишнее от клиента?
От: O-Sam Россия  
Дата: 07.03.06 10:01
Оценка:
Хочу скрыть от клиента логику remoting'ового клиент-серверного приложения, сделал две библиотеки, одна из них (общая)используется и на клиенте и на сервере и содержит только интерфейсы удаленный MarshalByRef объектов, другая (серверная) содержит классы, реализующие эти интефейсы.
К примеру, в CommonLib:

public interface IAuthServer
{
    AuthInfo Auth(string login, string password);
    void Logout(string sid);
}

...в ServerLib:
public class AuthServerImpl: MarshalByRefObject, IAuthServer
{
    public AuthServerImpl()
    {
        Console.WriteLine("AuthServerImpl constructor reporting...");
    }
            
        public AuthInfo Auth(string login, string password)
    {
        ...
    }

    public void Logout(string sid)
    {
        ...
    }
}


Таких пар интефейс-класс несколько, и всё было хорошо, пока не возникла необходимость сделать локальный серверный класс (то есть не MarshalByRef), и поместить ссылки на него во все MBR-объекты. Получается, что чтобы хранить ссылку на класс, необходимо вытаскивать его интерфейс в общую библиотеку, то есть вытаскивать тутда интерфейсы всяких permission manager'ов, session manager'ов, кэшей объектов и вообще всех используемых классов. Есть-ли какой-то обход этой засады?
Re: Как скрыть лишнее от клиента?
От: Константин Ленин  
Дата: 07.03.06 10:10
Оценка: 1 (1)
internal access modifier?
Re[2]: Как скрыть лишнее от клиента?
От: O-Sam Россия  
Дата: 07.03.06 10:23
Оценка:
Здравствуйте, Константин Ленин, Вы писали:

КЛ>internal access modifier?

Если я правильно понимаю, internal не позволит клиенту создать объект, но тем не менее интерфейс всё равно надо будет размещать в CommonLib.
Re: Как скрыть лишнее от клиента?
От: VladGalkin Украина  
Дата: 07.03.06 10:23
Оценка: 2 (1)
Здравствуйте, O-Sam, Вы писали:

OS>Таких пар интефейс-класс несколько, и всё было хорошо, пока не возникла необходимость сделать локальный серверный класс (то есть не MarshalByRef), и поместить ссылки на него во все MBR-объекты. Получается, что чтобы хранить ссылку на класс, необходимо вытаскивать его интерфейс в общую библиотеку,


Зачем вытаскивать интерфейс в общую библиотеку, если этот интерфейс используется в ServerLib, т.е. в реализации ClientLib.
И, соответсвенно, имеет отношение к реализации (хранение ссылок на класс).
Вот и оставляйте этот интерфейс в ServerLib, т.к олн имеет отношение к реализации и клиент его видеть не должен.
А вообще, то, что Вы делаете, называется Remote Facade.
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[3]: Как скрыть лишнее от клиента?
От: Максим Зелинский  
Дата: 07.03.06 11:09
Оценка: 1 (1)
Здравствуйте, O-Sam, Вы писали:

OS>Здравствуйте, Константин Ленин, Вы писали:


КЛ>>internal access modifier?

OS>Если я правильно понимаю, internal не позволит клиенту создать объект, но тем не менее интерфейс всё равно надо будет размещать в CommonLib.
Нет, читайте матчасть здесь.
В кратце internal делает тип видимым только внутри зборки, где он определен.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[2]: Как скрыть лишнее от клиента?
От: O-Sam Россия  
Дата: 07.03.06 11:40
Оценка:
Здравствуйте, VladGalkin, Вы писали:

VG>Здравствуйте, O-Sam, Вы писали:


OS>>Таких пар интефейс-класс несколько, и всё было хорошо, пока не возникла необходимость сделать локальный серверный класс (то есть не MarshalByRef), и поместить ссылки на него во все MBR-объекты. Получается, что чтобы хранить ссылку на класс, необходимо вытаскивать его интерфейс в общую библиотеку,


VG>Зачем вытаскивать интерфейс в общую библиотеку, если этот интерфейс используется в ServerLib, т.е. в реализации ClientLib.

VG>И, соответсвенно, имеет отношение к реализации (хранение ссылок на класс).
Просто сделал своеборазным "контроллером" непосредственно метод Main сервера, и он получал ссылку на объект так же через интерфейс, то есть все используемые методы и атрибуты необходимо определять и в интерфейсе тоже. Понял свою ошибку, сейчас буду делать контроллер внутри ServerLib.
Re[4]: Как скрыть лишнее от клиента?
От: O-Sam Россия  
Дата: 07.03.06 13:56
Оценка:
Здравствуйте, Максим Зелинский, Вы писали:

МЗ>Здравствуйте, O-Sam, Вы писали:


OS>>Здравствуйте, Константин Ленин, Вы писали:


КЛ>>>internal access modifier?

OS>>Если я правильно понимаю, internal не позволит клиенту создать объект, но тем не менее интерфейс всё равно надо будет размещать в CommonLib.
МЗ>Нет, читайте матчасть здесь.
МЗ>В кратце internal делает тип видимым только внутри зборки, где он определен.

Тем не менее, в одной библиотеке есть два класса, у одного из них один атрибут сделан с модификатором доступа internal. Когда второй класс пытается обратиться к этому полю, имеем

An unhandled exception of type 'System.Runtime.Remoting.RemotingException' occurred in mscorlib.dll
Additional information: Remoting cannot find field _sessionManager on type NeximServerLib.AuthServerImpl.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.