Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin中使用MassTransit_C#_Xamarin_Autofac_Masstransit - Fatal编程技术网

C# 在Xamarin中使用MassTransit

C# 在Xamarin中使用MassTransit,c#,xamarin,autofac,masstransit,C#,Xamarin,Autofac,Masstransit,我目前有一个WPF应用程序,利用Autofac和MassTransit。主WPF窗口是由不同控件组成的复合UI(状态部分、命令部分和主部分)。我通过使用MassTransit和InMemory传输与这些控件进行通信 当用户在特定的文本框中键入时,我发布了一个“IRipWidthChanged”事件。该事件的消费者将其拾取,并在WPF中很好地完成其工作 查看模型 private字符串\u ripWidthString; 公共字符串{ get=>\u字符串; 设置=>{ if(_ripWidthSt

我目前有一个WPF应用程序,利用Autofac和MassTransit。主WPF窗口是由不同控件组成的复合UI(状态部分、命令部分和主部分)。我通过使用MassTransit和InMemory传输与这些控件进行通信

当用户在特定的文本框中键入时,我发布了一个“IRipWidthChanged”事件。该事件的消费者将其拾取,并在WPF中很好地完成其工作

查看模型

private字符串\u ripWidthString;
公共字符串{
get=>\u字符串;
设置=>{
if(_ripWidthString==value)返回;
火属性已更改();
更改了FireProperty(名称(ClearValuesButtoneEnabled));
_bus.PublishAsync(new-RipWidthChanged.Builder(){NewRipWidth=value}.Build());
}
}
消费者

公共任务消耗(consumercontext ctx)=>task.Run(()=>
_viewModelFactory.Construct().UpdateRipWidth(ctx.Message.NewRipWidth)
);
当调用“RipWidthString”属性的setter时,总线将发布消息,但从未调用我的消费者。我添加了故障和其他机制,以查看是否发生了其他事情,但没有调用任何内容

我还使用相同的代码在这些前端之间设置Autofac容器,以便视图模型和ServiceBus在Autofac中注册

编辑1 下面是注册Autofac容器的代码

Android Xamarin项目中的MainActivity.cs

void RegisterDependencies(){
App.Register();
App.Register();
App.Register();
App.Register();
App.BuildContainer();
}
Xamarin核心项目中的App.xaml.cs文件

private static void SetupDiContainer(){
_RegisterModule(新的ViewModelModule());
_RegisterModule(新ServiceBusModule());
_RegisterModule(新的FactoriesModule());
_RegisterModule(新的ValidationModule());
_RegisterModule(新文件系统模块());
_RegisterModule(新的DataConversionModule());
_builder.RegisterType().As();
_builder.RegisterType()
.As()
.SingleInstance();
_builder.Register(ctx=>ServiceFactory.Construct(IPAddress.Parse(“192.168.1.12”),5001))
.As();
_builder.Register(ctx=>ServiceFactory.Construct(IPAddress.Parse(“192.168.1.12”),5001))
.As();
}
//...
公共静态void BuildContainer(){
SetupDiContainer();
_diContainer=_builder.Build();
}
以及设置和注册MassTransit巴士的代码

ServiceBusModule.cs自动传真模块

公共类ServiceBusModule:模块{
受保护的覆盖无效负载(ContainerBuilder builder){
builder.AddMassTransit(x=>{
x、 添加消费者(
类型(StateChangedConsumer),
类型(CutCompletedConsumer),
类型(设置消费者),
类型(消费者除外)
);
x、 AddBus(上下文=>Bus.Factory.CreateUsingInMemory(busConfig=>{
busConfig.ReceiveEndpoint(“panelsaw_queue”,cfg=>{
配置消费者(上下文);
});
}));
});
builder.Register(ctx=>newpanelsawservicebus(ctx.Resolve(),ctx.Resolve())
.As()
.SingleInstance();
}
}

任何其他遇到此问题的人。请记住,确保启动服务总线非常重要。我的WPF和Xamarin应用程序之间的区别在于,在引导过程中,WPF应用程序将解析IServiceBus接口,并在应用程序启动之前启动它


一旦我在Xamarin应用程序中做了同样的事情,一切都按照我的预期进行。我的消费者收到了正确的信息。

我不太清楚问题出在哪里——你是说你在应用程序的其他地方发布了IRipWidthChanged消息,它工作正常,但在这里不是吗?在我看来,这里有很多东西需要解包,我们可能需要更多的信息:特别是设置端点和总线的代码。我在这里看到的一个问题是,您没有(也不能)在属性设置器中等待。尝试使调用同步(不过您最好在WPF中这样做),可能在发布过程中出错?在WPF中,当总线发布消息时,我的消费者会像我预期的那样被调用。在Xamarin应用程序中,当视图模型发布消息“我的消费者未被呼叫”时。我的视图模型和使用者在WPF和Xamarin项目之间共享。