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