Хочу скрыть от клиента логику remoting'ового клиент-серверного приложения, сделал две библиотеки, одна из них (общая)используется и на клиенте и на сервере и содержит только интерфейсы удаленный MarshalByRef объектов, другая (серверная) содержит классы, реализующие эти интефейсы.
К примеру, в CommonLib:
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'ов, кэшей объектов и вообще всех используемых классов. Есть-ли какой-то обход этой засады?
Здравствуйте, Константин Ленин, Вы писали:
КЛ>internal access modifier?
Если я правильно понимаю, internal не позволит клиенту создать объект, но тем не менее интерфейс всё равно надо будет размещать в CommonLib.
Здравствуйте, O-Sam, Вы писали:
OS>Таких пар интефейс-класс несколько, и всё было хорошо, пока не возникла необходимость сделать локальный серверный класс (то есть не MarshalByRef), и поместить ссылки на него во все MBR-объекты. Получается, что чтобы хранить ссылку на класс, необходимо вытаскивать его интерфейс в общую библиотеку,
Зачем вытаскивать интерфейс в общую библиотеку, если этот интерфейс используется в ServerLib, т.е. в реализации ClientLib.
И, соответсвенно, имеет отношение к реализации (хранение ссылок на класс).
Вот и оставляйте этот интерфейс в ServerLib, т.к олн имеет отношение к реализации и клиент его видеть не должен.
А вообще, то, что Вы делаете, называется Remote Facade.
Здравствуйте, O-Sam, Вы писали:
OS>Здравствуйте, Константин Ленин, Вы писали:
КЛ>>internal access modifier? OS>Если я правильно понимаю, internal не позволит клиенту создать объект, но тем не менее интерфейс всё равно надо будет размещать в CommonLib.
Нет, читайте матчасть здесь.
В кратце internal делает тип видимым только внутри зборки, где он определен.
Здравствуйте, VladGalkin, Вы писали:
VG>Здравствуйте, O-Sam, Вы писали:
OS>>Таких пар интефейс-класс несколько, и всё было хорошо, пока не возникла необходимость сделать локальный серверный класс (то есть не MarshalByRef), и поместить ссылки на него во все MBR-объекты. Получается, что чтобы хранить ссылку на класс, необходимо вытаскивать его интерфейс в общую библиотеку,
VG>Зачем вытаскивать интерфейс в общую библиотеку, если этот интерфейс используется в ServerLib, т.е. в реализации ClientLib. VG>И, соответсвенно, имеет отношение к реализации (хранение ссылок на класс).
Просто сделал своеборазным "контроллером" непосредственно метод Main сервера, и он получал ссылку на объект так же через интерфейс, то есть все используемые методы и атрибуты необходимо определять и в интерфейсе тоже. Понял свою ошибку, сейчас буду делать контроллер внутри ServerLib.
Здравствуйте, Максим Зелинский, Вы писали:
МЗ>Здравствуйте, 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.