C#——参照传递的设计思想

C#——参照传递的设计思想,c#,algorithm,pass-by-reference,C#,Algorithm,Pass By Reference,我有一个C#Windows服务,可以将收到的电子邮件和推特评论路由到可用的代理机构(我真的不知道,但该应用程序的功能非常类似)。因此,我有一个代理的列表,以及将这些电子邮件和tweet路由到可用代理的逻辑 我的代码看起来怎么样 我有一个AgentManager类,它跟踪哪些代理可用、他们的技能水平等。 我有一个EmailManager类,它将电子邮件路由到代理。 我有一个TwitterManager类,它将Tweets路由到代理 因此-与代理相关的逻辑,例如代理列表、谁可用、谁有能力发推特、谁有

我有一个C#Windows服务,可以将收到的电子邮件和推特评论路由到可用的
代理机构
(我真的不知道,但该应用程序的功能非常类似)。因此,我有一个
代理的列表,以及将这些电子邮件和tweet路由到可用代理的逻辑

我的代码看起来怎么样

我有一个
AgentManager
类,它跟踪哪些代理可用、他们的技能水平等。 我有一个
EmailManager
类,它将
电子邮件
路由到
代理
。 我有一个
TwitterManager
类,它将
Tweets
路由到
代理

因此-与
代理相关的逻辑,例如
代理列表
、谁可用、谁有能力发
推特
、谁有能力发
电子邮件等都在
代理管理器

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

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

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

h最新的
AgentManager
(因此也是最新的代理列表)。不知怎么的,这感觉很脏。我知道从裁判身边传球已经过时了,但这似乎是处理这件事的好方法。我做错了吗

编辑:
我通过引用传递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);

您是通过引用传递还是存储引用。非常不同的事情,但听起来像是在存储引用(即电子邮件管理器存储指向代理管理器的指针)。为了更加清晰,可能需要重新编写这个问题。如果AgentManager是一个类,那么您将不得不跳过一些障碍,以避免通过引用传递它。我的意思是,你基本上是在描述EF使用的长寿命上下文,对吗?我只是为了存储而通过引用传递,对不对。@Alex:同意。C#中的内容更多地是通过引用传递的。您是说您要创建一个EmailManager(AgentManager)构造函数吗?但是AgentManager是一个引用类型,因此您只需通过传递它就可以通过引用传递它。你只需要指定“ref”关键字,当你想编辑一些不必是引用类型的东西时。我喜欢这个想法,我认为它更有意义。EmailManager还有什么其他问题吗?EmailManager和TweetManager都是长期运行的过程,彼此独立工作。不幸的是,我不能像你上面所说的那样直接设置它(我愿意),但电子邮件是实时的,因为推特是“轮询”的。这两种机制都是独立运作的——只需要知道哪些代理“可用”。我想我可以把所有的事件排成一列,然后一次处理它们,以达到类似于上面的效果?史蒂夫-我真的很喜欢这个想法。谢谢
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)
     {
         .....
     }


}