Это может казаться немного нечетным, но я действительно должен создать обходное решение для очень сложного дуплекса - коммуникации - обрабатывающий в C#, особенно чтобы вынудить других разработчиков наблюдать DRY - принцип.
Таким образом, то, что я делаю, должно иметь основанную на типе мультитонну, которая похожа на это:
internal sealed class SessionManager<T> where T : DuplexServiceBase
который не является никакой проблемой вообще - до сих пор.
Однако, как только я хочу иметь сервисы (я иду с одним экземпляром на сессию), регистрируют себя в SessionManager, стычка запускается:
internal abstract class DuplexServiceBase : MessageDispatcherBase<Action>
(MessageDispatcherBase, являющийся моим классом, который создает поток и асинхронно отправляет сообщения).
Я хочу иметь метод, который похож на это:
protected void ProcessInboundMessage()
{
// Connect
SessionManager<self>.Current.Connect(this);
}
... но проблема - как я добрался бы до "сам"?
Я действительно ДОЛЖЕН разделить менеджеры сеансов для каждого класса обслуживания, потому что у них всех есть свои собственные уведомления (в основном, это - очень раздражающий "NotifyAllClients" - метод, который делает, мы хотим вытащить мои собственные волосы в течение прошлых часов), и должен рассматриваться отдельно.
У Вас есть КАКИЕ-ЛИБО идеи?
Я не хочу использовать "AsyncPattern = верный", btw..., это потребовало бы, чтобы я бросил безопасность типов, обеспечил соблюдение контракта (это приведет к очень плохому злоупотреблению системой связи, которую я настраиваю здесь), и потребовал бы отказа от DRY - принцип, будет много повторяющегося кода повсеместно, и это - что-то, что я серьезно осуждаю.
Править:
Я нашел самое лучшее решение благодаря ответам здесь - это - ДОПОЛНИТЕЛЬНЫЙ МЕТОД, hehe...
public static SessionManager<T> GetSessionManager<T>(this T sessionObject)
where T : DuplexServiceBase
{
return SessionManager<T>.Current;
}
Я могу использовать это как это:
GetSessionManager().Connect(this);
Миссия выполняется.:-D
Этот метод (принадлежит DuplexServiceBase) дает мне менеджер сеансов, с которым я хочу работать.Прекрасно!:-)
Я бы написал вспомогательный метод:
static class SessionManager { // non-generic!
static void Connect<T>(T item) where T : DuplexServiceBase {
SessionManager<T>.Current.Connect(item);
}
}
и использовал бы SessionManager.Connect (this)
, который определит это автоматически через вывод общего типа.
Вы можете заключить вызов в общий метод, тем самым воспользовавшись выводом типа компилятора:
private static void ConnectSessionManager<T>(T service)
{
SessionManager<T>.Current.Connect(service)
}
protected void ProcessInboundMessage()
{
// Connect
ConnectSessionManager(this);
}