1

我有一个 C# Windows 服务,可以将传入的电子邮件和 twitter 评论路由到可用Agents(我真的不知道 - 但该应用程序做了非常相似的事情)。所以,我有一个列表Agents和逻辑,可以将这些电子邮件和推文路由到可用的代理。

我的代码看起来如何?

我有一AgentManager门课程可以跟踪哪些代理可用、他们的技能水平等。我有一EmailManager门课程可以路由EmailsAgents. 我有一个TwitterManager路由TweetsAgents.

所以 - 与 相关的逻辑Agents,例如 的列表Agents,谁可用,谁有能力 a Tweet,谁有能力aEmail等都在AgentManager.

现在,当EmailManager检测到有新电子邮件并需要将其分配给 时Agent,我想要

从中获取我的代理列表AgentManager(而不是返回数据库或在 中保留单独的代理列表EmailManager)。

我最初的想法是通过引用传递AgentManager给。EmailManager我想这样做的原因是代理更改状态、添加/删除等 -EmailManager将始终保持机智

h 最新的AgentManager(因此也是最新的代理列表)。不知何故 - 这感觉很脏。我知道通过 ref 传递是不合时宜的,但这似乎是处理这个问题的好方法。我做错了吗?

编辑: 我通过引用传递 AgentManager 进行存储,而不是在 EmailManager 类中更改它。

4

1 回答 1

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)
     {
         .....
     }


}
于 2012-05-17T14:01:57.767 回答