2016-12-14 28 views
0

我必须在传入消息之前验证传入的消息。 要做到这一点,我需要从数据库中请求一些数据。Masstransit过滤IoC注入/数据库

继教程之后,我创建了扩展方法来将我的规范+过滤器应用于使用者管道。事情是这样的:

public static void UseArticlesImportValidation(this IConsumePipeConfigurator configurator){} 

public class ArticlesImportValidationSpecification : IPipeSpecification<ConsumeContext<ArticlesImportNotification>> 

和筛选

public class ArticlesImportValidationFilter : IFilter<ConsumeContext<ArticlesImportNotification>> 

一切看起来不错,但我想注入一些商务服务,我过滤器重复使用某些功能+ DAL服务。这对我的消费者使用Autofac扩展方法builder.RegisterConsumers(Assembly.GetExecutingAssembly());完全正常。

我应该使用中间件吗?有什么建议么?

回答

1

你需要有内置容器中的规范(很容易,当你调用AddPipeSpecification,然后在说明书中对作为参数传递:

public void Apply(IPipeBuilder<T> builder) 
{ 
    builder.AddFilter(new ArticlesImportValidationFilter(container.Resolve<IDataAccessSomethingUseful>())); 
} 

但我会在消费者如果验证或,你想,让他们独立,有一个消费者来验证并发送一条消息给做实际工作。

+0

这就是我最终做到了,是什么让消费者内部验证的原因吗?或者有两个消费者?赢”它使信息的流动复杂化了吗? –

+0

它取决于(tm)。在我的解决方案中,我实现了CQRS我需要发送一个有效的命令给我的域模型。这意味着发件人必须预先验证这些内容。在我有一些不受信任的发件人的情况下,我介绍了这种验证的中间步骤,但由于它不适用于所有人,因此总是运行此验证将是矫枉过正的。因此,我滑倒它。另外,如果验证失败,你会怎么做?如果你有一个消费者 - 你可以发回消息说“离开”,这是一个很好的做法。 –

+0

@JevgenijNekrasov有在github问题https://github.com/MassTransit/MassTransit/issues/737类似的事情,可能是这将有助于太。 –