C# - 关于参照传递的设计思考

时间:2012-05-17 13:51:45

标签: c# algorithm pass-by-reference

我有一个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类中更改它。

1 个答案:

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


}