我有一个C#Windows服务,可以将传入的电子邮件和Twitter评论路由到可用的Agents
(我不是 - 但应用程序执行的操作非常相似)。所以,我有一个Agents
列表,以及将这些电子邮件和推文发送给可用代理的逻辑。
我的代码看起来如何?
我有一个AgentManager
课程,可以跟踪哪些代理商可用,他们的技能水平等。
我有一个EmailManager
课程,可以将Emails
路由到Agents
。
我有一个TwitterManager
课程,可以将Tweets
路由到Agents
。
所以 - 与Agents
相关的逻辑,例如可用的Agents
列表,具有Tweet
容量的Email
,具有AgentManager
的容量等等都在EmailManager
中。
现在,当Agent
检测到有新电子邮件需要将其分配给AgentManager
时,我想要
从EmailManager
获取我的代理列表(而不是返回数据库或在AgentManager
中保留单独的代理列表)。
我最初的想法是通过引用将EmailManager
传递给EmailManager
。我想这样做的原因是代理人改变状态,添加/删除等等 - AgentManager
将始终有效工作
h最新的{{1}}(以及最新的代理商列表)。不知何故 - 这感觉很脏。我知道通过ref传递已经不合时宜了,但它似乎是处理这个问题的好方法。我做错了吗?
修改 我通过引用传递AgentManager进行存储,而不是在EmailManager类中更改它。
答案 0 :(得分:2)
从你的描述看起来更像是另一种方式
AgentManager进程发电子邮件和推文并了解其代理商的所有内容 -
所以它应该有一个接收电子邮件/推文列表并处理它们的方法。
因为我们说的是参考类型,关于通过ref传递的问题有点不清楚。
例如:
AgentManager ag = new AgentManager();
EMailManager eg = new EMailManager();
TweetManaget tg = new TweetManager();
eg.LoadEMail();
List<EMails> mails = eg.GetMailsList();
tg.LoadTweet();
List<Tweets> tws = tg.GetTweetsList();
ag.ProcessData(mails, tws);
编辑:看看OP的评论,我想到了另一个策略
让EMailManager和TweetManager声明AgentManager订阅的事件 -
eg.EmailReceived += ag.NotifyEmail;
tg.TweetPolled += ag.NotifyTweet;
public class EventManager
{
public delegate void OnMailReceived(EMails m);
public event MailReceived;
........
private void GetMail()
{
EMails m;
.....
if(MailReceived != null)
MailReceived(m);
}
}
public class AgentManager()
{
public void NotifyEMail(EMails m)
{
.....
}
}