/// <summary> /// Creata a new <see cref="MessageContext"/> from /// an existing set of entities. /// </summary> /// <param name="name"> /// The message name. This cannot be null, empty or whitespace. /// </param> /// <param name="contextType"> /// Whether this is a new or attached context. /// </param> /// <param name="behavior"> /// (Optional) Modifications to the default behavior of <see cref="MessageContext"/>. /// </param> /// <param name="disposeAction"> /// (Optional) Callback to invoke on disposal. /// </param> /// <exception cref="ArgumentException"> /// <paramref name="contextType"/> is unknown or invalid. /// </exception> /// <exception cref="ArgumentNullException"> /// <paramref name="name"/> cannot be null, empty or whitespace. /// </exception> internal MessageContext(string name, ContextType contextType, MessageContextBehavior behavior = MessageContextBehavior.Default, Action <MessageContext> disposeAction = null) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException(name); } Name = name; ContextType = contextType; SlotName = SlotNamePrefix + name; if (contextType == ContextType.New) { _entry = new MessageContextEntry(behavior); ContextHelper <MessageContextEntry> .PushContextData(SlotName, _entry); } else if (contextType == ContextType.Attached) { ContextHelper <MessageContextEntry> .GetContextDataStack(SlotName).TryPeek(out _entry); } else if (contextType == ContextType.Detached) { _entry = new MessageContextEntry(behavior); } else { throw new ArgumentException(string.Format("Unknown contextType '{0}'", contextType), "contextType"); } _disposeAction = disposeAction; }
/// <summary> /// Get the current (top most) cache context if the context exists or a /// detached context otherwise. /// </summary> /// <param name="name"> /// The name of this message. This cannot be null, empty or whitespace. /// </param> /// <param name="behavior"> /// (Optional) Modifications to the default behavior of <see cref="MessageContext"/>. /// This is ignored for an existing message context. /// </param> /// <returns> /// The current <see cref="CacheContext"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// There is no current cache context. /// </exception> /// <exception cref="ArgumentNullException"> /// <paramref name="name"/> cannot be null, empty or whitespace. /// </exception> /// <seealso cref="IsSet"/> public static MessageContext GetContext(string name, MessageContextBehavior behavior = MessageContextBehavior.Default) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException(name); } return(new MessageContext( name, IsSet(name) ? ContextType.Attached : ContextType.Detached, behavior)); }
public void Test_DisposeAction(MessageContextBehavior behavior) { const string testName = "a"; bool wasCalled = false; Action <MessageContext> callback = (ctx) => { Assert.That(ctx, Is.Not.Null); wasCalled = true; }; using (MessageContext messageContext = new MessageContext(testName, MessageContextBehavior.Capturing, callback)) { } Assert.That(wasCalled, Is.True); }
/// <summary> /// Create a new <see cref="MessageContext"/>. /// </summary> /// <param name="name"> /// The message name. This cannot be null, empty or whitespace. /// </param> /// <param name="behavior"> /// (Optional) Modifications to the default behavior of <see cref="MessageContext"/>. /// </param> /// <param name="disposeAction"> /// (Optional) Callback to invoke on disposal. /// </param> public MessageContext(string name, MessageContextBehavior behavior = MessageContextBehavior.Default, Action <MessageContext> disposeAction = null) : this(name, ContextType.New, behavior, disposeAction) { // Do nothing }
/// <summary> /// Create a new <see cref="MessageContext"/>. /// </summary> /// <param name="behavior"> /// Modifications to the default behavior of <see cref="MessageContextEntry"/>. /// </param> public MessageContextEntry(MessageContextBehavior behavior = MessageContextBehavior.Default) { Message = (behavior & MessageContextBehavior.Capturing) == MessageContextBehavior.Capturing ? new StringBuilder() : null; Behavior = behavior; }