gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:57:26 25 4
gpt4 key购买 nike

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

[ServerModule(ModuleName)]
public class ModuleController : ServerModuleBase<ModuleConfig>
{
protected override void OnInitialize()
{
Container.LoadComponents<IMyPlugin>();
}

protected override void OnStart()
{
Container.Resolve<IBinaryConnectionFactory>();
Container.Resolve<IMyPlugin>().Start();
}
}
[Plugin(LifeCycle.Singleton, typeof(IMyPlugin), Name = PluginName)]
public class MyPlugin: IMyPlugin
{
private IBinaryConnection _connection;

public IBinaryConnectionFactory ConnectionFactory { get; set; }

public IBinaryConnectionConfig Config { get; set; }

public void Start()
{
_connection = ConnectionFactory.Create(Config, new MyMessageValidator());
_connection.Received += OnReceivedDoSomething;

_connection.Start();
}
}
当我启动运行时我得到一个 NullReferenceException 因为 ConnectionFactory不注入(inject)。我的错误在哪里?

最佳答案

使用 the binary connection在您的模块中,您可以实例化 TcpClientConnection TcpListenerConnection 手动或使用您的模块 DI-Container,正如您已经尝试过的,我会推荐。
要在您的模块中使用它,您需要将类注册/加载到您的容器中。看看如何资源管理 registers them .在您的 OnInitialize你需要:

Container.Register<IBinaryConnectionFactory>(); // Register as factory
Container.LoadComponents<IBinaryConnection>(); // Register implementations
然后您可以添加 BinaryConnectionConfig进入您的配置并使用 [PluginConfigs(typeof(IBinaryConnection), false)] 进行装饰从 MaintenanceWeb 中选择 Socket 以及 Client/Server 或使用派生类型 TcpClientConfig/ TcpListenerConfig直接地。
public class ModuleConfig : ConfigBase
{
[DataMember, PluginConfigs(typeof(IBinaryConnection), false)]
public BinaryConnectionConfig ConnectionConfig { get; set; }
}
然后在你的插件中注入(inject) IBinaryConnectionFactoryModuleConfig创建连接。
public class MyPlugin: IMyPlugin
{
private IBinaryConnection _connection;

public IBinaryConnectionFactory ConnectionFactory { get; set; }

public ModuleConfig Config { get; set; }

public void Start()
{
_connection = ConnectionFactory.Create(Config.ConnectionConfig, new MyMessageValidator());
_connection.Received += OnReceivedDoSomething;

_connection.Start();
}
}
PS:解决工厂在 OnStart返回一个您不使用且不必要的实例。不要混淆 Resolve (查找已注册的实现并创建实例)与 Register .

关于c# - 如何在我的模块中使用 BinaryConnection 发送和接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63735621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com