(使用C#处理.net环境)
我们正在编写一个管理多个数据提供代理的专有服务器,这里有一些伪代码,因此简化了解释:
class Server
{
ServerManagementGUI server_gui; // a GUI to display all sort of Server related data
MonitorAgent m_agnt;
DataAgent d_agnt;
// will not be allocated or init at C'tor
public write_data1();
public write_data2();
public get_data5();
// etc
}
class Agent
{
// handles generic communication and threading issues
// a reference to Server is required to write
// the data to it's private data structures.
// please note that a delegate to one or more function will not suffice here.
Agent(Server server);
}
class MonitorAgent : Agent
{
// handles task spesific issues
}
class DataAgent : Agent
{
// handles task spesific issues
}
这个想法是代理异步收集数据,处理任何通信和线程问题,并使用Server
的方法来填充它的数据结构。
我们不确定上述是否是“良好做法”设计。
如果您对我们的设计有任何其他想法或见解,请告知我们。
的更新: 的
Server
还有一个GUI对象,它可以为其提供一些信息。
因为代理是那些实际生成数据(从Web上获取数据或从硬件传感器获取数据)的代理,它必须能够直接访问ServerManagementGUI
的方法。现在,由于每个代理使用Server
和ServerManagementGUI
的不同方法和属性,我们认为将引用传递给整个对象最方便。
答案 0 :(得分:0)
我不会将Server引用直接传递给代理。 Agent需要的不是实际的服务器引用,而是服务器的抽象,比如IServerContext。让服务器对象为您实现此接口,然后在创建代理期间,您可以向代理注入IServerContext的引用。 这有助于您在服务器和代理之间建立一对低通信合同。因此,您的代理不依赖于服务器实现。 此外,它使您能够简单地对IServerContext进行单元测试,并确保它提供不同代理可能需要的所需数据和行为。 其他好处是您也可以使用任何IoC库将不同代理的多个不同实现注入到不同的代理中。