Tur*_*ete 7 c# wcf singleton type-systems design-patterns
这看起来有点奇怪,但我真的需要为C#中非常复杂的双工 - 通信 - 处理创建一个解决方法,特别是强迫其他开发人员遵守DRY原则.
所以我正在做的是有一个类型为基础的multiton,如下所示:
internal sealed class SessionManager<T> where T : DuplexServiceBase
Run Code Online (Sandbox Code Playgroud)
这根本没问题 - 到目前为止.
但是,只要我想拥有服务(我将在每个会话中使用一个实例)使用SessionManager注册自己,麻烦就开始了:
internal abstract class DuplexServiceBase : MessageDispatcherBase<Action>
Run Code Online (Sandbox Code Playgroud)
(MessageDispatcherBase是我的一个类,它创建一个线程并异步发送消息).
我想有一个看起来像这样的方法:
protected void ProcessInboundMessage()
{
// Connect
SessionManager<self>.Current.Connect(this);
}
Run Code Online (Sandbox Code Playgroud)
......但问题是 - 我怎么才能进入"自我"?
我真的需要为每个服务类单独的会话管理器,因为它们都有自己的通知(基本上它是非常讨厌的"NotifyAllClients" - 这个方法让我们想要在最后几个小时内完成自己的头发)并且需要单独处理.
你有什么想法?
我不想使用"AsyncPattern = true",顺便说一句......这将要求我放弃类型安全,强制执行合同(这会导致滥用我在此处设置的通信系统)和需要放弃DRY原则,整个地方会有很多重复的代码,这是我非常鄙视的事情.
编辑:
我找到了最好的解决方案,感谢这里的答案 - 这是一种扩展方法,呵呵......
public static SessionManager<T> GetSessionManager<T>(this T sessionObject)
where T : DuplexServiceBase
{
return SessionManager<T>.Current;
}
Run Code Online (Sandbox Code Playgroud)
我可以这样使用:
GetSessionManager().Connect(this);
Run Code Online (Sandbox Code Playgroud)
任务完成.:-D
这个方法(属于DuplexServiceBase)给了我想要使用的会话管理器.完善!:-)
Mar*_*ell 15
我写了一个帮助方法:
static class SessionManager { // non-generic!
static void Connect<T>(T item) where T : DuplexServiceBase {
SessionManager<T>.Current.Connect(item);
}
}
Run Code Online (Sandbox Code Playgroud)
并使用SessionManager.Connect(this)
它将通过泛型类型推断自动计算出来.
归档时间: |
|
查看次数: |
2379 次 |
最近记录: |