1
0
mirror of synced 2024-06-14 01:57:40 +00:00

[ci skip] Done with XML documentation for now

Made a few classes internal that were supposed to be
This commit is contained in:
Mark van Renswoude 2019-08-15 11:26:55 +02:00
parent 314a67db00
commit fed377992b
28 changed files with 112 additions and 56 deletions

View File

@ -9,7 +9,7 @@ namespace Tapeti.DataAnnotations
/// <summary> /// <summary>
/// Validates consumed messages using System.ComponentModel.DataAnnotations /// Validates consumed messages using System.ComponentModel.DataAnnotations
/// </summary> /// </summary>
public class DataAnnotationsMessageMiddleware : IMessageMiddleware internal class DataAnnotationsMessageMiddleware : IMessageMiddleware
{ {
/// <inheritdoc /> /// <inheritdoc />
public Task Handle(IMessageContext context, Func<Task> next) public Task Handle(IMessageContext context, Func<Task> next)

View File

@ -9,7 +9,7 @@ namespace Tapeti.DataAnnotations
/// <summary> /// <summary>
/// Validates published messages using System.ComponentModel.DataAnnotations /// Validates published messages using System.ComponentModel.DataAnnotations
/// </summary> /// </summary>
public class DataAnnotationsPublishMiddleware : IPublishMiddleware internal class DataAnnotationsPublishMiddleware : IPublishMiddleware
{ {
/// <inheritdoc /> /// <inheritdoc />
public Task Handle(IPublishContext context, Func<Task> next) public Task Handle(IPublishContext context, Func<Task> next)

View File

@ -6,7 +6,11 @@ using Tapeti.Flow.FlowHelpers;
namespace Tapeti.Flow.Default namespace Tapeti.Flow.Default
{ {
public class FlowContinuationMiddleware : IControllerFilterMiddleware, IControllerMessageMiddleware, IControllerCleanupMiddleware /// <inheritdoc cref="IControllerMessageMiddleware"/> />
/// <summary>
/// Handles methods marked with the Continuation attribute.
/// </summary>
internal class FlowContinuationMiddleware : IControllerFilterMiddleware, IControllerMessageMiddleware, IControllerCleanupMiddleware
{ {
public async Task Filter(IControllerMessageContext context, Func<Task> next) public async Task Filter(IControllerMessageContext context, Func<Task> next)
{ {

View File

@ -22,6 +22,7 @@ namespace Tapeti.Flow.Default
private readonly IInternalPublisher publisher; private readonly IInternalPublisher publisher;
/// <inheritdoc />
public FlowProvider(ITapetiConfig config, IPublisher publisher) public FlowProvider(ITapetiConfig config, IPublisher publisher)
{ {
this.config = config; this.config = config;

View File

@ -3,16 +3,20 @@ using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Tapeti.Config; using Tapeti.Config;
using Tapeti.Default;
namespace Tapeti.Flow.Default namespace Tapeti.Flow.Default
{ {
public class FlowStarter : IFlowStarter /// <inheritdoc />
/// <summary>
/// Default implementation for IFlowStarter.
/// </summary>
internal class FlowStarter : IFlowStarter
{ {
private readonly ITapetiConfig config; private readonly ITapetiConfig config;
private readonly ILogger logger; private readonly ILogger logger;
/// <inheritdoc />
public FlowStarter(ITapetiConfig config, ILogger logger) public FlowStarter(ITapetiConfig config, ILogger logger)
{ {
this.config = config; this.config = config;
@ -20,22 +24,25 @@ namespace Tapeti.Flow.Default
} }
/// <inheritdoc />
public Task Start<TController>(Expression<Func<TController, Func<IYieldPoint>>> methodSelector) where TController : class public Task Start<TController>(Expression<Func<TController, Func<IYieldPoint>>> methodSelector) where TController : class
{ {
return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] { }); return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] { });
} }
/// <inheritdoc />
public Task Start<TController>(Expression<Func<TController, Func<Task<IYieldPoint>>>> methodSelector) where TController : class public Task Start<TController>(Expression<Func<TController, Func<Task<IYieldPoint>>>> methodSelector) where TController : class
{ {
return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => (Task<IYieldPoint>)value, new object[] {}); return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => (Task<IYieldPoint>)value, new object[] {});
} }
/// <inheritdoc />
public Task Start<TController, TParameter>(Expression<Func<TController, Func<TParameter, IYieldPoint>>> methodSelector, TParameter parameter) where TController : class public Task Start<TController, TParameter>(Expression<Func<TController, Func<TParameter, IYieldPoint>>> methodSelector, TParameter parameter) where TController : class
{ {
return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] {parameter}); return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] {parameter});
} }
/// <inheritdoc />
public Task Start<TController, TParameter>(Expression<Func<TController, Func<TParameter, Task<IYieldPoint>>>> methodSelector, TParameter parameter) where TController : class public Task Start<TController, TParameter>(Expression<Func<TController, Func<TParameter, Task<IYieldPoint>>>> methodSelector, TParameter parameter) where TController : class
{ {
return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => (Task<IYieldPoint>)value, new object[] {parameter}); return CallControllerMethod<TController>(GetExpressionMethod(methodSelector), value => (Task<IYieldPoint>)value, new object[] {parameter});

View File

@ -22,12 +22,15 @@ namespace Tapeti.Flow.Default
private volatile bool inUse; private volatile bool inUse;
private volatile bool loaded; private volatile bool loaded;
/// <inheritdoc />
public FlowStore(IFlowRepository repository) public FlowStore(IFlowRepository repository)
{ {
this.repository = repository; this.repository = repository;
} }
/// <inheritdoc />
public async Task Load() public async Task Load()
{ {
if (inUse) if (inUse)
@ -50,6 +53,7 @@ namespace Tapeti.Flow.Default
} }
/// <inheritdoc />
public Task<Guid?> FindFlowID(Guid continuationID) public Task<Guid?> FindFlowID(Guid continuationID)
{ {
if (!loaded) if (!loaded)
@ -59,6 +63,7 @@ namespace Tapeti.Flow.Default
} }
/// <inheritdoc />
public async Task<IFlowStateLock> LockFlowState(Guid flowID) public async Task<IFlowStateLock> LockFlowState(Guid flowID)
{ {
if (!loaded) if (!loaded)
@ -70,18 +75,20 @@ namespace Tapeti.Flow.Default
return flowStatelock; return flowStatelock;
} }
private class FlowStateLock : IFlowStateLock private class FlowStateLock : IFlowStateLock
{ {
private readonly FlowStore owner; private readonly FlowStore owner;
private readonly Guid flowID;
private volatile IDisposable flowLock; private volatile IDisposable flowLock;
private FlowState flowState; private FlowState flowState;
public Guid FlowID { get; }
public FlowStateLock(FlowStore owner, Guid flowID, IDisposable flowLock) public FlowStateLock(FlowStore owner, Guid flowID, IDisposable flowLock)
{ {
this.owner = owner; this.owner = owner;
this.flowID = flowID; this.FlowID = flowID;
this.flowLock = flowLock; this.flowLock = flowLock;
owner.flowStates.TryGetValue(flowID, out flowState); owner.flowStates.TryGetValue(flowID, out flowState);
@ -94,8 +101,6 @@ namespace Tapeti.Flow.Default
l?.Dispose(); l?.Dispose();
} }
public Guid FlowID => flowID;
public Task<FlowState> GetFlowState() public Task<FlowState> GetFlowState()
{ {
if (flowLock == null) if (flowLock == null)
@ -121,22 +126,22 @@ namespace Tapeti.Flow.Default
foreach (var addedContinuation in newFlowState.Continuations.Where(c => flowState == null || !flowState.Continuations.ContainsKey(c.Key))) foreach (var addedContinuation in newFlowState.Continuations.Where(c => flowState == null || !flowState.Continuations.ContainsKey(c.Key)))
{ {
owner.continuationLookup.TryAdd(addedContinuation.Key, flowID); owner.continuationLookup.TryAdd(addedContinuation.Key, FlowID);
} }
var isNew = flowState == null; var isNew = flowState == null;
flowState = newFlowState; flowState = newFlowState;
owner.flowStates[flowID] = newFlowState; owner.flowStates[FlowID] = newFlowState;
// Storing the flowstate in the underlying repository // Storing the flowstate in the underlying repository
if (isNew) if (isNew)
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
await owner.repository.CreateState(flowID, flowState, now); await owner.repository.CreateState(FlowID, flowState, now);
} }
else else
{ {
await owner.repository.UpdateState(flowID, flowState); await owner.repository.UpdateState(FlowID, flowState);
} }
} }
@ -150,12 +155,12 @@ namespace Tapeti.Flow.Default
foreach (var removedContinuation in flowState.Continuations.Keys) foreach (var removedContinuation in flowState.Continuations.Keys)
owner.continuationLookup.TryRemove(removedContinuation, out _); owner.continuationLookup.TryRemove(removedContinuation, out _);
owner.flowStates.TryRemove(flowID, out _); owner.flowStates.TryRemove(FlowID, out _);
if (flowState != null) if (flowState != null)
{ {
flowState = null; flowState = null;
await owner.repository.DeleteState(flowID); await owner.repository.DeleteState(FlowID);
} }
} }
} }

View File

@ -4,6 +4,9 @@ using System.Threading.Tasks;
namespace Tapeti.Flow.Default namespace Tapeti.Flow.Default
{ {
/// <summary>
/// Default implementation for IFlowRepository. Does not persist any state, relying on the FlowStore's cache instead.
/// </summary>
public class NonPersistentFlowRepository : IFlowRepository public class NonPersistentFlowRepository : IFlowRepository
{ {
Task<List<KeyValuePair<Guid, T>>> IFlowRepository.GetStates<T>() Task<List<KeyValuePair<Guid, T>>> IFlowRepository.GetStates<T>()
@ -11,16 +14,19 @@ namespace Tapeti.Flow.Default
return Task.FromResult(new List<KeyValuePair<Guid, T>>()); return Task.FromResult(new List<KeyValuePair<Guid, T>>());
} }
/// <inheritdoc />
public Task CreateState<T>(Guid flowID, T state, DateTime timestamp) public Task CreateState<T>(Guid flowID, T state, DateTime timestamp)
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
/// <inheritdoc />
public Task UpdateState<T>(Guid flowID, T state) public Task UpdateState<T>(Guid flowID, T state)
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
/// <inheritdoc />
public Task DeleteState(Guid flowID) public Task DeleteState(Guid flowID)
{ {
return Task.CompletedTask; return Task.CompletedTask;

View File

@ -4,19 +4,27 @@ using System.Threading.Tasks;
namespace Tapeti.Flow.FlowHelpers namespace Tapeti.Flow.FlowHelpers
{ {
/// <summary>
/// Implementation of an asynchronous locking mechanism.
/// </summary>
public class LockCollection<T> public class LockCollection<T>
{ {
private readonly Dictionary<T, LockItem> locks; private readonly Dictionary<T, LockItem> locks;
/// <inheritdoc />
public LockCollection(IEqualityComparer<T> comparer) public LockCollection(IEqualityComparer<T> comparer)
{ {
locks = new Dictionary<T, LockItem>(comparer); locks = new Dictionary<T, LockItem>(comparer);
} }
/// <summary>
/// Waits for and acquires a lock on the specified key. Dispose the returned value to release the lock.
/// </summary>
/// <param name="key"></param>
public Task<IDisposable> GetLock(T key) public Task<IDisposable> GetLock(T key)
{ {
// ReSharper disable once InconsistentlySynchronizedField - by design // ReSharper disable once InconsistentlySynchronizedField - by design
LockItem nextLi = new LockItem(locks, key); var nextLi = new LockItem(locks, key);
try try
{ {
bool continueImmediately = false; bool continueImmediately = false;
@ -45,6 +53,7 @@ namespace Tapeti.Flow.FlowHelpers
return nextLi.GetTask(); return nextLi.GetTask();
} }
private class LockItem : IDisposable private class LockItem : IDisposable
{ {
internal volatile LockItem Next; internal volatile LockItem Next;
@ -83,7 +92,7 @@ namespace Tapeti.Flow.FlowHelpers
if (li != this) if (li != this)
{ {
// Something is wrong (comparer is not stable?), but we cannot loose the completions sources // Something is wrong (comparer is not stable?), but we cannot lose the completions sources
while (li.Next != null) while (li.Next != null)
li = li.Next; li = li.Next;
li.Next = Next; li.Next = Next;

View File

@ -2,8 +2,15 @@
namespace Tapeti.Flow.FlowHelpers namespace Tapeti.Flow.FlowHelpers
{ {
/// <summary>
/// Converts a method into a unique string representation.
/// </summary>
public static class MethodSerializer public static class MethodSerializer
{ {
/// <summary>
/// Converts a method into a unique string representation.
/// </summary>
/// <param name="method"></param>
public static string Serialize(MethodInfo method) public static string Serialize(MethodInfo method)
{ {
return method.Name + '@' + method.DeclaringType?.Assembly.GetName().Name + ':' + method.DeclaringType?.FullName; return method.Name + '@' + method.DeclaringType?.Assembly.GetName().Name + ':' + method.DeclaringType?.FullName;

View File

@ -4,11 +4,39 @@ using System.Threading.Tasks;
namespace Tapeti.Flow namespace Tapeti.Flow
{ {
/// <summary>
/// Provides persistency for flow states.
/// </summary>
public interface IFlowRepository public interface IFlowRepository
{ {
/// <summary>
/// Load the previously persisted flow states.
/// </summary>
/// <returns>A list of flow states, where the key is the unique Flow ID and the value is the deserialized T.</returns>
Task<List<KeyValuePair<Guid, T>>> GetStates<T>(); Task<List<KeyValuePair<Guid, T>>> GetStates<T>();
/// <summary>
/// Stores a new flow state. Guaranteed to be run in a lock for the specified flow ID.
/// </summary>
/// <param name="flowID"></param>
/// <param name="state"></param>
/// <param name="timestamp"></param>
/// <returns></returns>
Task CreateState<T>(Guid flowID, T state, DateTime timestamp); Task CreateState<T>(Guid flowID, T state, DateTime timestamp);
/// <summary>
/// Updates an existing flow state. Guaranteed to be run in a lock for the specified flow ID.
/// </summary>
/// <param name="flowID"></param>
/// <param name="state"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
Task UpdateState<T>(Guid flowID, T state); Task UpdateState<T>(Guid flowID, T state);
/// <summary>
/// Delete a flow state. Guaranteed to be run in a lock for the specified flow ID.
/// </summary>
/// <param name="flowID"></param>
Task DeleteState(Guid flowID); Task DeleteState(Guid flowID);
} }
} }

View File

@ -2,8 +2,13 @@
namespace Tapeti.Flow namespace Tapeti.Flow
{ {
/// <inheritdoc />
/// <summary>
/// Raised when a response is expected to end a flow, but none was provided.
/// </summary>
public class ResponseExpectedException : Exception public class ResponseExpectedException : Exception
{ {
/// <inheritdoc />
public ResponseExpectedException(string message) : base(message) { } public ResponseExpectedException(string message) : base(message) { }
} }
} }

View File

@ -2,8 +2,13 @@
namespace Tapeti.Flow namespace Tapeti.Flow
{ {
/// <inheritdoc />
/// <summary>
/// Raised when an invalid yield point is returned.
/// </summary>
public class YieldPointException : Exception public class YieldPointException : Exception
{ {
/// <inheritdoc />
public YieldPointException(string message) : base(message) { } public YieldPointException(string message) : base(message) { }
} }
} }

View File

@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<NoWarn>1701;1702;1591</NoWarn> <NoWarn>1701;1702</NoWarn>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -9,7 +9,7 @@ namespace Tapeti.Transient
/// Implements a binding for transient request response messages. /// Implements a binding for transient request response messages.
/// Register this binding using the WithTransient config extension method. /// Register this binding using the WithTransient config extension method.
/// </summary> /// </summary>
public class TransientGenericBinding : IBinding internal class TransientGenericBinding : IBinding
{ {
private readonly TransientRouter router; private readonly TransientRouter router;
private readonly string dynamicQueuePrefix; private readonly string dynamicQueuePrefix;

View File

@ -6,7 +6,7 @@ namespace Tapeti.Transient
/// <summary> /// <summary>
/// Default implementation of ITransientPublisher /// Default implementation of ITransientPublisher
/// </summary> /// </summary>
public class TransientPublisher : ITransientPublisher internal class TransientPublisher : ITransientPublisher
{ {
private readonly TransientRouter router; private readonly TransientRouter router;
private readonly IPublisher publisher; private readonly IPublisher publisher;

View File

@ -10,7 +10,7 @@ namespace Tapeti.Transient
/// <summary> /// <summary>
/// Manages active requests and responses. For internal use. /// Manages active requests and responses. For internal use.
/// </summary> /// </summary>
public class TransientRouter internal class TransientRouter
{ {
private readonly int defaultTimeoutMs; private readonly int defaultTimeoutMs;
private readonly ConcurrentDictionary<Guid, TaskCompletionSource<object>> map = new ConcurrentDictionary<Guid, TaskCompletionSource<object>>(); private readonly ConcurrentDictionary<Guid, TaskCompletionSource<object>> map = new ConcurrentDictionary<Guid, TaskCompletionSource<object>>();

View File

@ -9,7 +9,7 @@ namespace Tapeti.Connection
/// <summary> /// <summary>
/// Implements the bridge between the RabbitMQ Client consumer and a Tapeti Consumer /// Implements the bridge between the RabbitMQ Client consumer and a Tapeti Consumer
/// </summary> /// </summary>
public class TapetiBasicConsumer : DefaultBasicConsumer internal class TapetiBasicConsumer : DefaultBasicConsumer
{ {
private readonly IConsumer consumer; private readonly IConsumer consumer;
private readonly Func<ulong, ConsumeResult, Task> onRespond; private readonly Func<ulong, ConsumeResult, Task> onRespond;

View File

@ -9,7 +9,6 @@ using Newtonsoft.Json;
using RabbitMQ.Client; using RabbitMQ.Client;
using RabbitMQ.Client.Events; using RabbitMQ.Client.Events;
using RabbitMQ.Client.Exceptions; using RabbitMQ.Client.Exceptions;
using RabbitMQ.Client.Framing;
using Tapeti.Config; using Tapeti.Config;
using Tapeti.Default; using Tapeti.Default;
using Tapeti.Exceptions; using Tapeti.Exceptions;
@ -21,7 +20,7 @@ namespace Tapeti.Connection
/// <summary> /// <summary>
/// Implementation of ITapetiClient for the RabbitMQ Client library /// Implementation of ITapetiClient for the RabbitMQ Client library
/// </summary> /// </summary>
public class TapetiClient : ITapetiClient internal class TapetiClient : ITapetiClient
{ {
private const int ReconnectDelay = 5000; private const int ReconnectDelay = 5000;
private const int MandatoryReturnTimeout = 30000; private const int MandatoryReturnTimeout = 30000;

View File

@ -12,7 +12,7 @@ namespace Tapeti.Connection
/// <summary> /// <summary>
/// Implements a RabbitMQ consumer to pass messages to the Tapeti middleware. /// Implements a RabbitMQ consumer to pass messages to the Tapeti middleware.
/// </summary> /// </summary>
public class TapetiConsumer : IConsumer internal class TapetiConsumer : IConsumer
{ {
private readonly ITapetiConfig config; private readonly ITapetiConfig config;
private readonly string queueName; private readonly string queueName;

View File

@ -1,19 +1,15 @@
using System; using System;
using System.Diagnostics;
using System.Reflection; using System.Reflection;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using RabbitMQ.Client;
using Tapeti.Annotations; using Tapeti.Annotations;
using Tapeti.Config; using Tapeti.Config;
using Tapeti.Default; using Tapeti.Default;
using Tapeti.Exceptions;
using Tapeti.Helpers; using Tapeti.Helpers;
namespace Tapeti.Connection namespace Tapeti.Connection
{ {
/// <inheritdoc /> /// <inheritdoc />
public class TapetiPublisher : IInternalPublisher internal class TapetiPublisher : IInternalPublisher
{ {
private readonly ITapetiConfig config; private readonly ITapetiConfig config;
private readonly Func<ITapetiClient> clientFactory; private readonly Func<ITapetiClient> clientFactory;

View File

@ -7,7 +7,7 @@ using Tapeti.Config;
namespace Tapeti.Connection namespace Tapeti.Connection
{ {
/// <inheritdoc /> /// <inheritdoc />
public class TapetiSubscriber : ISubscriber internal class TapetiSubscriber : ISubscriber
{ {
private readonly Func<ITapetiClient> clientFactory; private readonly Func<ITapetiClient> clientFactory;
private readonly ITapetiConfig config; private readonly ITapetiConfig config;

View File

@ -6,11 +6,7 @@ using Tapeti.Config;
namespace Tapeti.Default namespace Tapeti.Default
{ {
/// <inheritdoc /> internal class ControllerBindingContext : IControllerBindingContext
/// <summary>
/// Default implementation for IControllerBindingContext
/// </summary>
public class ControllerBindingContext : IControllerBindingContext
{ {
private BindingTargetMode? bindingTargetMode; private BindingTargetMode? bindingTargetMode;
private readonly List<IControllerMiddlewareBase> middleware = new List<IControllerMiddlewareBase>(); private readonly List<IControllerMiddlewareBase> middleware = new List<IControllerMiddlewareBase>();

View File

@ -1,11 +1,8 @@
using System; using Tapeti.Config;
using System.Collections.Generic;
using Tapeti.Config;
namespace Tapeti.Default namespace Tapeti.Default
{ {
/// <inheritdoc cref="IControllerMessageContext" /> internal class ControllerMessageContext : IControllerMessageContext
public class ControllerMessageContext : IControllerMessageContext
{ {
private readonly IMessageContext decoratedContext; private readonly IMessageContext decoratedContext;

View File

@ -14,7 +14,7 @@ namespace Tapeti.Default
/// instead use the ITapetiConfigBuilder RegisterController / RegisterAllControllers extension /// instead use the ITapetiConfigBuilder RegisterController / RegisterAllControllers extension
/// methods. /// methods.
/// </summary> /// </summary>
public class ControllerMethodBinding : IBinding internal class ControllerMethodBinding : IBinding
{ {
/// <summary> /// <summary>
/// Contains all the required information to bind a controller method to a queue. /// Contains all the required information to bind a controller method to a queue.

View File

@ -3,11 +3,7 @@ using Tapeti.Config;
namespace Tapeti.Default namespace Tapeti.Default
{ {
/// <inheritdoc /> internal class ExceptionStrategyContext : IExceptionStrategyContext
/// <summary>
/// Default implementation of IExceptionStrategyContext.
/// </summary>
public class ExceptionStrategyContext : IExceptionStrategyContext
{ {
/// <summary> /// <summary>
/// The ConsumeResult as set by the exception strategy. Defaults to Error. /// The ConsumeResult as set by the exception strategy. Defaults to Error.

View File

@ -4,8 +4,7 @@ using Tapeti.Config;
namespace Tapeti.Default namespace Tapeti.Default
{ {
/// <inheritdoc /> internal class MessageContext : IMessageContext
public class MessageContext : IMessageContext
{ {
private readonly Dictionary<string, object> items = new Dictionary<string, object>(); private readonly Dictionary<string, object> items = new Dictionary<string, object>();

View File

@ -6,11 +6,7 @@ using Tapeti.Config;
namespace Tapeti.Default namespace Tapeti.Default
{ {
/// <inheritdoc /> internal class RabbitMQMessageProperties : IMessageProperties
/// <summary>
/// Wrapper for RabbitMQ Client's IBasicProperties
/// </summary>
public class RabbitMQMessageProperties : IMessageProperties
{ {
/// <summary> /// <summary>
/// Provides access to the wrapped IBasicProperties /// Provides access to the wrapped IBasicProperties

View File

@ -5,7 +5,7 @@
namespace Tapeti namespace Tapeti
{ {
/// <summary> /// <summary>
/// Base class for message controllers /// Base class for message controllers.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Using this base class is not required, you can add the MessageController attribute /// Using this base class is not required, you can add the MessageController attribute