まず、 'UserContext'を、ユーザーの正しいコンテキストで受信メッセージを実行するために必要ないくつかのプロパティとして定義しましょうstring
。私の場合、これには、ユーザーが作業していたアプリケーションの「インスタンス」に関するデータも含まれます。
私が見ているように、メッセージに「UserContext」を提供するには2つの主なオプションがあります。
- ヘッダーとして
- メッセージの基本クラスとして
ヘッダーを使用する場合、独自のシリアライゼーションを提供する必要があります。基本クラスを使用する場合、Rebus がシリアライゼーションを解決してくれます。
そこで、小さなサンプル プログラムを使用して基本クラスを使用してスパイクしました。
public class UserContext
{
public string Name { get; set; }
public int UserId { get; set; }
public Guid AppId { get; set; }
}
public class UserContextMessageBase
{
public UserContext UserContext { get; set; }
}
public class SimpleMessage : UserContextMessageBase
{
public string Data { get; set; }
}
internal class Program
{
private static void Main(string[] args)
{
using (var adapter = new BuiltinContainerAdapter())
using (var timer = new Timer())
{
//adapter.Register(typeof(UserContextHandler));
adapter.Register(typeof(SimpleMessageHandler));
var bus = Configure.With(adapter)
.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
.MessageOwnership(d => d.FromRebusConfigurationSection())
//.SpecifyOrderOfHandlers(o => o.First<UserContextHandler>())
.CreateBus()
.Start();
timer.Elapsed += delegate
{
bus.Send(new Messages.SimpleMessage { Data = Guid.NewGuid().ToString() });
};
timer.Interval = 10000;
timer.Start();
Console.WriteLine("Press enter to quit");
Console.ReadLine();
}
}
}
internal class UserContextHandler : IHandleMessages<UserContextMessageBase>
{
protected UserContext _context;
public void Handle(UserContextMessageBase message)
{
var old = Console.ForegroundColor;
if (_context != null)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Context is already populated");
}
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine("Processing UserContextMessageBase");
// create the correct Context to process the message
_context = message.UserContext;
Console.ForegroundColor = old;
}
}
internal class SimpleMessageHandler : **UserContextHandler**, IHandleMessages<SimpleMessage>
{
public void Handle(SimpleMessage message)
{
// allow to use the _context to process this message
Console.WriteLine("Received SimpleMessage {0}", message.Data);
}
}
しかし、プログラムを実行すると、 が2 回SimpleMessage
処理されていることがわかります。これは「設計による」ものですか、それともバグですか?
一方、 の登録のコメントを外してUserContextHandler
、からを継承することはできませんが、 を に詰め込み、からそのまま使用する必要があります。SimpleMessageHandler
UserContextHandler
UserContext
MessageContext
SimpleMessageHandler