我试图将.net核心转移到使用CallContext.LogicalGet/SetData的现有.net应用程序.
当Web请求到达应用程序时,我在CallContext中保存了CorrelationId,每当我需要稍后在轨道上记录某些内容时,我可以轻松地从CallContext中收集它,而无需在任何地方传输它.
因为.net核心不再支持CallContext,因为它是System.Messaging的一部分.修改了哪些选项?
我看到的一个版本是可以使用AsyncLocal(AsyncLocal的语义与逻辑调用上下文有什么不同?)但看起来好像我必须传输这个变量,而这个变量超出了目的,它不是方便.
我使用的是MassTransit 3.0.0.0,我很难理解如何在请求-响应方案中拦截消息,并在接收者端读取的标题字段中添加一些信息。
我正在按照MassTransit文档中的建议查看中间件 -请参阅“ 观察者”警告-但您在“发送”中获得的上下文只是一个Pipe上下文,无法访问Headers字段,因此我无法更改它。我使用了“ 中间件”页面中提供的示例。
然后,我看着IPublishInterceptor
public class X<T> : IPublishInterceptor<T> where T : class, PipeContext
{
public Task PostPublish(PublishContext<T> context)
{
return new Task(() => { });
}
public Task PostSend(PublishContext<T> context, SendContext<T> sendContext)
{
return new Task(() => { });
}
public Task PrePublish(PublishContext<T> context)
{
context.Headers.Set("ID", Guid.NewGuid().ToString());
return new Task(() => { });
}
public Task PreSend(PublishContext<T> context, SendContext<T> sendContext)
{
context.Headers.Set("ID", Guid.NewGuid().ToString());
return new Task(() => { });
}
}
Run Code Online (Sandbox Code Playgroud)
这是非常清楚和简洁的。但是,我不知道在哪里使用它以及如何将其链接到其余基础结构。就目前而言,这只是一个没有真正链接到任何东西的接口。
我希望验证传入的消息,在我的情况下使用FluentValidation,如果失败则应立即返回.我查看了http://docs.masstransit-project.com/en/latest/usage/observers.html,就我而言,我喜欢这个想法
public class ConsumeObserver : IConsumeObserver
{
Task IConsumeObserver.PreConsume<T>(ConsumeContext<T> context)
{
//1.Validate here
//2. If success go on to consumer
//3. If fails exit with the result of validation and don't go through consumer.
}
Task IConsumeObserver.PostConsume<T>(ConsumeContext<T> context)
{
}
Task IConsumeObserver.ConsumeFault<T>(ConsumeContext<T> context, Exception exception)
{
}
}
Run Code Online (Sandbox Code Playgroud)
因为我得到的消息已经反序列化,所以很容易使用验证器.问题是我不知道如何在不通过消费者的情况下返回,同时保持验证错误.
谢谢.
我是 DDD 的初学者,我尝试用 C# 优雅地建模下一个场景:
基本上只有一个名称属性和必须按特定顺序执行的项目列表的模板。
public class Template
{
public string Name { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string Name { get; set; }
public int Order { get; set; }
}
Run Code Online (Sandbox Code Playgroud)一种称为 Profile 的类型。
public class Profile
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)profile 类的意思是
这看起来像是聚合根是模板,其中包含项目列表和配置文件列表。但我觉得按配置文件名称搜索需要我搜索具有给定名称的配置文件的所有模板。不知何故,对于具有 CRUD 背景的人来说,这似乎要付出高昂的代价。此外,配置文件是使用模板的配置文件,并且让模板了解使用它的配置文件似乎是错误的。
你如何建模?这里的聚合根应该是什么?是不止一个吗?如果您想从 UI 中使用搜索,如何执行搜索?