我有一个c windows服务,可以将收到的电子邮件和twitter评论路由到可用的Agents
(我不是真的-但是这个应用做了一些非常相似的事情)。所以,我有一个Agents
列表,以及将这些电子邮件和tweets路由到可用代理的逻辑。
我的代码看起来怎么样?
我有一个AgentManager
类,它跟踪哪些代理可用,他们的技能水平等。
我有一个将EmailManager
路由到Emails
的Agents
类。
我有一个将TwitterManager
路由到Tweets
的类。
因此,与Agents
相关的逻辑,如Agents
列表、可用人员、具有Agents
容量的人员、具有Tweet
容量的人员等都在Email
中。
现在,当AgentManager
检测到有新电子邮件并需要将其分配给EmailManager
时,我希望
从Agent
获取我的代理列表(而不是返回数据库或在AgentManager
中保留单独的代理列表)。
我最初的想法是通过引用将EmailManager
传递到AgentManager
。我想这样做的原因是,当代理更改状态、添加/删除等时-EmailManager
将始终与
h最新的EmailManager
(因此是最新的代理列表)不知怎么的-这感觉很脏。我知道这是过时的通过裁判,但这似乎是一个很好的方式来处理这个问题。我做错了吗?
编辑:
我通过引用传递agentmanager以进行存储,而不是在emailmanager类中更改它。
最佳答案
从你的描述来看,似乎更倾向于走另一条路。
代理管理者处理电子邮件和推特,并了解其代理的所有信息-
因此它应该有一个方法来接收电子邮件/推文列表并对其进行处理。
因为我们谈到的是引用类型,所以关于传递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)
{
.....
}
}