我正在浏览示例并阅读文档,但我仍然不确定如何为我的场景配置rebus(或者使用总线是一个很好的选择).
我有一个要做的任务生产者,比如说ImportOrder和CalculateOrderPrice
我想从生产者转储消息并将大量这些消息排队.我想要两个侦听ImportOrder的客户端和10个侦听CalculatePriceOfOrder的客户端.我不希望同一个订单同时转到多个端点,我正在尝试分散工作量.
到目前为止生产者配置:
<rebus inputQueue="publisher.input" errorQueue="publisher.error" workers="1" maxRetries="5">
Run Code Online (Sandbox Code Playgroud)
var adapter = new BuiltinContainerAdapter();
Configure.With(adapter)
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
.Subscriptions(s => s.StoreInXmlFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "rebus_subscriptions.xml")))
.MessageOwnership(d => d.FromRebusConfigurationSection())
.CreateBus()
.Start();
Run Code Online (Sandbox Code Playgroud)
目前消费者配置:
<rebus inputQueue="calcserver1.input" errorQueue="calcserver1.error" workers="1" maxRetries="5">
<endpoints>
<add messages="Messages.RecalculateContractMessage, Messages" endpoint="publisher.RecalculateContract@se-devws-0007.sirius.local"/>
</endpoints>
Run Code Online (Sandbox Code Playgroud)
Configure.With(adapter)
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
.MessageOwnership(d => d.FromRebusConfigurationSection())
.CreateBus()
.Start();
adapter.Bus.Subscribe<RecalculateContractMessage>();
Run Code Online (Sandbox Code Playgroud)
我似乎无法配置此设置,如果我使用msmq或sqlserver并不重要.
在设置我的模拟调用函数时,我得到了一个我从NSubstitute没想到的行为.行为的简化版本是
[Test]
public void NSubstituteTest()
{
var mockedFoo = Substitute.For<IFoo>();
mockedFoo.GenerateString(Arg.Any<string>()).Returns(x => GetValue(x.Args()[0]));
mockedFoo.GenerateString("0").Returns("hi");
string result1 = mockedFoo.GenerateString("0");
string result2 = mockedFoo.GenerateString("1");
Assert.AreEqual("hi", result1);
Assert.AreEqual("1", result2);
}
private string GetValue(object val)
{
string returnValue = val != null ? val.ToString() : "I am null";
System.Diagnostics.Trace.WriteLine(returnValue);
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
测试通过,但我得到输出:0 1
这表明调用了mockedFoo.GenerateString("0"); 实际上会导致调用GetValue()函数.
如果我对Moq做同样的事情:
[Test]
public void MoqTest()
{
var mockedFoo = new Mock<IFoo>();
mockedFoo.Setup(x => x.GenerateString(It.IsAny<string>())).Returns((object s) => GetValue(s));
mockedFoo.Setup(x => x.GenerateString("0")).Returns("hi");
string result1 = mockedFoo.Object.GenerateString("0");
string result2 = mockedFoo.Object.GenerateString("1"); …Run Code Online (Sandbox Code Playgroud)