- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个项目,一切正常,但我有一个紧密耦合的依赖项,我不知道如何反转/注入(inject)。
问题出在我的 Consumer 类中,它将接收命令消息以启动一个进程,该进程是全局消息队列服务项目的一部分,例如MyCompany.MQ.Services
,但对命令消息告诉它启动的进程具有紧密耦合的依赖性,例如:
public Task Consume(ConsumeContext<MyMessageInterface> context)
{
logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
try
{
TightCoupleProcess tcp = new TightCoupleProcess(context);
logger.Information("{Blah}, {Blah}, {Blah}", context.Message.exampleVar1, context.Message.exampleVar2, context.Message.exampleVar3);
tcp.StartProcess();
return Task.CompletedTask;
}
catch (Exception ex)
{
return Task.FromException(ex);
}
}
Task Consume
是 MassTransit 的一部分,我无法修改 Consume
的签名,因为它实际上是 IConsumer
接口(interface)的实现公共(public)交通
。
我想我想要的是一种反转/注入(inject)该依赖关系的方法,以便我的全局 MQ.services
项目不依赖于调用它的项目。我想我对反转/注入(inject)有一些误解,但我不确定如何表达我的缺点。也许我想要的是不可能的。我知道我不能修改接口(interface)实现,但如果像下面这样的东西起作用我会很酷,但由于 Consume
是 MassTransit 接口(interface)的实现,我不认为我可以注入(inject)来 self 的调用类的匿名函数:
public Task Consume(ConsumeContext<MyMessageInterface> context, AnonFunc() func)
{
try
{
func(context)
logger.Information("{Blah}, {Blah}, {Blah}", context.Message.exampleVar1, context.Message.exampleVar2, context.Message.exampleVar3);
return Task.CompletedTask;
}
catch (Exception ex)
{
return Task.FromException(ex);
}
}
我已经通过使用反射并将此逻辑放在 MQ.Services
项目中来设法绕过其他依赖项,例如消息类型定义,这使我可以保留所有 TightCoupleProcess
处理 MQ.serives
项目之外的相关代码,例如:
public void PublishMessage(object msg)
{
MethodInfo method = this.GetType().GetMethod("InvokePublish");
MethodInfo generic = method.MakeGenericMethod(msg.GetType());
generic.Invoke(this, new object[] { msg });
}
public void InvokePublish<T>(object msg)
{
Task.Run(async () =>
{
await busControl.Publish(msg);
}).Wait();
}
但我不能对 Consumer
应用类似的策略,因为我已经提到的限制以及我敢肯定的健康剂量的无知。
如果这是可能的,有人会指出我正确的方向吗?
更多信息:
项目:App.SubscriberConsole
-> 引用 App.Services.Subscriber
项目:App.Services.Subscriber
-> 引用 MyCompany.MQ.Services.Consumer
等
项目 MyCompany.MQ.Services.Consumer
-> 引用 MassTransit
-> 实现 MassTransit.IConsumer
最佳答案
我不确定您为什么考虑注入(inject) Consume
方法。方法签名来自接口(interface),您无法更改它。
您应该在消费者类构造函数中注入(inject)。考虑注入(inject)工厂委托(delegate)是正确的。
public class MyMessageConsumer : IConsumer<MyMessage>
{
private readonly Func<IConsumeContext<MyMessage>, TightCoupleProcess> factory;
public MyMessageConsumer(Func<IConsumeContext<MyMessage>, TightCoupleProcess> factory)
{
_factory = factory;
}
public Task Consume(ConsumeContext<MyMessage> context)
{
var tcp = _factory(context);
tcp.StartProcess();
return Task.CompletedTask;
}
}
然后你这样配置它:
Func<IConsumeContext<MyMessage>, TightCoupleProcess> factory = c => new TightCoupleProcess(c);
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint(host, "customer_update_queue", e =>
{
e.Consumer<MyMessageConsumer>(() => new MyMessageConsumer(factory));
});
});
您可以在端点 in the documentation 上找到更多消费者配置方法的重载.
还有一点。您对 Serilog 有严重的问题。您为您使用的每条消息创建记录器配置。这个不对。您应该在您的应用程序入口点创建记录器配置一次。
然后,您要么注入(inject)您的记录器,要么使用全局 Log
对象,或者使用 MassTransit.SerilogIntegration
包并在您的消费者中使用 MassTransit 日志记录。
关于c# - 如何反转/注入(inject)依赖 - MassTransit Consumer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47584900/
我已经开始研究 MassTransit 并正在编写将处理消息的类。当我从 Consumes 实现接口(interface)时我有四个选项:All , Selected , For和 Context .
我正在尝试找出消费者群体级别是否也有任何抵消。在 Kafka 中,Consumer Offset 是在 Consumer group 级别还是在该 consumer group 内的单个消费者? 最佳
我有一个我不理解的 java 编译器错误。看来消费者 和 Consumer(带有 T 扩展对象)在方法签名参数中不等效。请查看以下代码: import java.util.function.Consu
我在泛型方面遇到了一些麻烦,尽管找到了解决方法,但我不明白是什么阻止了我的代码编译。 我有一个显示 TreeTableView 的 JavaFX 项目:
C++11 标准定义了一个内存模型(1.7、1.10),其中包含内存排序,大致为“顺序一致”、“获取”、“消耗”、“释放”和“放松”。同样粗略地,一个程序只有在它是无种族的情况下才是正确的,如果所有
我有一个 kafka 主题,我正在通过 Kafka Producer 发送数据。现在,在消费者方面,我有两种选择。 1。使用 KafkaConsumer - 下面是 kafkaConsumer 的代码
我有四个当前消费者在 Amazon AWS 上收听同一个队列。从队列中拉取消息时,有时会出现同一条消息被两个不同的消费者消费的情况。请看下面的日志: 18:01:46,515 [jmsContaine
我正在设计一个系统,其中将有 n 个生产者和 m 个消费者,其中 n 和 m 是数字,n != m。 我想这样设计系统, 任何生产者在生产时不得阻止其他生产者 任何消费者都不应在消费时阻止其他消费者
我们有一个系统,我们希望将记录(例如联系人、客户、机会)从我们的系统推送到 SalesForce。 为此,我们使用了 ForceToolKit for .Net .我们成功地将联系人记录从我们的系统推
我怎样才能写一个方法来组合 Stream的 Consumers成单个 Consumer使用 Consumer.andThen(Consumer) ? 我的第一个版本是: Consumer combi
我需要开始使用 kafka。我很难理解消费者应该收到什么:据我了解,我们可以通过多种方式配置消费者: 示例 1: @KafkaListener(topics = "topic_name) public
我需要开始使用 kafka。我很难理解消费者应该收到什么:据我了解,我们可以通过多种方式配置消费者: 示例 1: @KafkaListener(topics = "topic_name) public
我正在尝试在我的 scala play 应用程序中创建消费者 secret / key 对,但我似乎无法让它正常工作。我有以下代码 import org.apache.commons.codec.bi
我通过传递用户(消费者)名称使用 .NET 应用程序,我需要从 Salesforce 检索消费者 key 和消费者 key ,我该如何实现。 最佳答案 Consumer Key 和 Consumer
我想设置 至 0 .这似乎是另一个问题 ( JMS queue with multiple consumers ) 的答案,并在此 article 中进行了描述。在第 17.1.1 章中。我使用 JN
I have send message api to my users.When I send to message from my x numbers I need to wait 10-15
我有一个 java Kafka 消费者,我在其中批量获取 ConsumerRecords 进行处理。示例代码如下- while (true) { ConsumerRecords records
我正在为 iPhone 编写 Twitter/Facebook 应用程序。我有自己的 Apache/PHP 服务器。我只想把Consumer Key放在app里,然后我把Consumer Secret
Spring AMQP:比较多个消费者与每个消费者多个线程的性能 我正处于从 Spring 文档学习 Spring AMQP 的阶段。我不清楚提高异步消息消费率的首选方法:根据 Spring 文档 (
我正在制作一个需要 oAuth 1.0 身份验证的应用程序。我可以访问客户提供的消费者 key 和消费者 secret 。我曾尝试使用 AFNetworking 进行此操作,但效果不佳。有人可以建议我
我是一名优秀的程序员,十分优秀!