public static IQueryHandler <TQuery, TResponse> Default <TQuery, TResponse>(object handler, IServiceProvider provider) where TQuery : IQuery <TResponse> { var logger = provider.GetService <ILogger>(); var validations = provider.GetServices <IValidator <TQuery> >(); var loggingDecorator = new LoggingQueryDecorator <TQuery, TResponse>((IQueryHandler <TQuery, TResponse>)handler, logger); var validationDecorator = new ValidationQueryDecorator <TQuery, TResponse>(loggingDecorator, validations); var retryDecorator = new RetryQueryDecorator <TQuery, TResponse>(validationDecorator, logger); return(retryDecorator); // order is revers for decorators }
public void Test_ReturnsCorrectValueOnNoErrors() { // Arrange int expected = 5; var queryMock = new Mock <IQuery <int, int> >(); queryMock.SetupSequence(x => x.Execute(It.IsAny <int>())) .Returns(expected); var sut = new RetryQueryDecorator <int, int>(queryMock.Object); // Act var actual = sut.Execute(0); // Assert Assert.Equal(expected, actual); queryMock.Verify(x => x.Execute(It.IsAny <int>()), Times.Exactly(1)); }
public void Test_ThrowsAfterRetriesOnErrors() { // Arrange var queryMock = new Mock <IQuery <int, int> >(); queryMock.SetupSequence(x => x.Execute(It.IsAny <int>())) .Throws(new ArgumentException()) .Throws(new ArgumentException()) .Throws(new ArgumentException()) .Throws(new ArgumentException()) .Throws(new ArgumentException()) .Throws(new ArgumentException()); var sut = new RetryQueryDecorator <int, int>(queryMock.Object); // Act Assert.Throws <ArgumentException>(() => sut.Execute(0)); queryMock.Verify(x => x.Execute(It.IsAny <int>()), Times.Exactly(5)); }