【发布时间】:2017-12-01 00:34:09
【问题描述】:
我正在做一个项目,一切正常,但我有一个紧密耦合的依赖项,我不明白如何反转/注入。
问题出在我的 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 的签名,因为这实际上是 MassTransit 的 IConsumer 接口的实现。
我想我想要的是一种反转/注入该依赖项的方法,以便我的全局 MQ.services 项目不依赖于调用它的项目。我想我对反转/注入有一些误解,但我不确定如何表达我的缺点。也许我想要的不可能。我知道我不能修改接口实现,但如果像下面这样的工作我会很酷,但由于 Consume 是 MassTransit 接口的实现,我认为我不能从我的调用类:
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
【问题讨论】:
标签: c# reflection dependency-injection masstransit constructor-injection