C# 如何在我的模块中使用BinaryConnection发送和接收数据

C# 如何在我的模块中使用BinaryConnection发送和接收数据,c#,tcp,moryx,C#,Tcp,Moryx,我有一个自定义模块MyModule和一个自定义插件MyPlugin,在这个插件中,我想通过二进制连接发送和接收数据。 这是我的代码的简化版本 [ServerModule(ModuleName)] 公共类ModuleController:ServerModuleBase { 受保护的重写void OnInitialize() { Container.LoadComponents(); } 受保护的覆盖void OnStart() { Container.Resolve(); Container.R

我有一个自定义模块
MyModule
和一个自定义插件
MyPlugin
,在这个插件中,我想通过二进制连接发送和接收数据。 这是我的代码的简化版本

[ServerModule(ModuleName)]
公共类ModuleController:ServerModuleBase
{
受保护的重写void OnInitialize()
{
Container.LoadComponents();
}
受保护的覆盖void OnStart()
{
Container.Resolve();
Container.Resolve().Start();
}
}
[插件(LifeCycle.Singleton,typeof(IMyPlugin),Name=PluginName)]
公共类MyPlugin:IMyPlugin
{
专用IBinaryConnection\u连接;
公共IBinaryConnectionFactory连接工厂{get;set;}
公共IBinaryConnectionConfig配置{get;set;}
公开作废开始()
{
_connection=ConnectionFactory.Create(配置,新的MyMessageValidator());
_connection.Received+=OnReceivedDoSomething;
_connection.Start();
}
}
当我启动运行时,我得到一个NullReferenceException,因为没有注入
ConnectionFactory
。我的错误在哪里?

要在模块中使用,您可以实例化并手动使用模块DI容器,正如您已经尝试过的,我建议您这样做

要在模块中使用它,需要将类注册/加载到容器中。看看资源管理是如何进行的。在您的
初始化中,您需要:

Container.Register();//注册为工厂
Container.LoadComponents();//寄存器实现
然后,您可以向配置中添加一个
BinaryConnectionConfig
条目,并使用
[plugin无花果(typeof(IBinaryConnection),false)]
进行修饰,以从维护Web选择套接字以及客户机/服务器,或者直接使用派生类型
TcpClientConfig
/
TcpListenerConfig

公共类ModuleConfig:ConfigBase
{
[DataMember,PluginFigures(typeof(IBinaryConnection),false)]
公共二进制连接配置连接配置{get;set;}
}
在插件中,您可以插入
IBinaryConnectionFactory
ModuleConfig
来创建连接

公共类MyPlugin:IMyPlugin
{
专用IBinaryConnection\u连接;
公共IBinaryConnectionFactory连接工厂{get;set;}
公共模块配置{get;set;}
公开作废开始()
{
_connection=ConnectionFactory.Create(Config.ConnectionConfig,new MyMessageValidator());
_connection.Received+=OnReceivedDoSomething;
_connection.Start();
}
}

PS:在
OnStart
中解析工厂将返回一个实例,您不使用该实例,并且该实例是不必要的。不要把
Resolve
(查找已注册的实现并创建实例)与
Register

混淆,谢谢,我想为了获得双工连接,我需要
ConnectionFactory
为我创建两个连接,一个是侦听器连接,一个是客户端配置连接,不是吗,连接总是双工的。请参阅
Send
-方法和
Received
-事件。侦听器和客户端确定您是打开套接字还是连接到套接字。这就是为什么他们有不同的连接设置。