From 501ad4c5b5f077956d94c4254d981b8e4e548381 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 6 Oct 2016 03:40:27 -0400 Subject: [PATCH] Implement IHasResolver and change all IRequest to use shared TryResolverInternal --- lib/ServiceStack.Interfaces.dll | Bin 129024 -> 129024 bytes .../Configuration/IResolver.cs | 5 ++++ src/ServiceStack/Host/AspNet/AspNetRequest.cs | 24 ++++++++++-------- src/ServiceStack/Host/BasicRequest.cs | 4 +-- .../Host/HttpListener/ListenerRequest.cs | 24 ++++++++++-------- .../Host/NetCore/NetCoreRequest.cs | 12 +++++++-- src/ServiceStack/RequestExtensions.cs | 14 ++++++++++ src/ServiceStack/Testing/MockHttpRequest.cs | 18 ++++++++----- .../ContainerTests.cs | 4 +-- 9 files changed, 71 insertions(+), 34 deletions(-) diff --git a/lib/ServiceStack.Interfaces.dll b/lib/ServiceStack.Interfaces.dll index de925e6c5e9576c09f613c937cb185cb685dc2ce..97c8401ce8bf6a6c36e8af3a9a4961052e507449 100644 GIT binary patch delta 28117 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 delta 28456 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 diff --git a/src/ServiceStack.Interfaces/Configuration/IResolver.cs b/src/ServiceStack.Interfaces/Configuration/IResolver.cs index c738d7b758f..9898b64bf65 100644 --- a/src/ServiceStack.Interfaces/Configuration/IResolver.cs +++ b/src/ServiceStack.Interfaces/Configuration/IResolver.cs @@ -9,4 +9,9 @@ public interface IResolver /// T TryResolve(); } + + public interface IHasResolver + { + IResolver Resolver { get; } + } } \ No newline at end of file diff --git a/src/ServiceStack/Host/AspNet/AspNetRequest.cs b/src/ServiceStack/Host/AspNet/AspNetRequest.cs index f768e1815e2..265f3062824 100644 --- a/src/ServiceStack/Host/AspNet/AspNetRequest.cs +++ b/src/ServiceStack/Host/AspNet/AspNetRequest.cs @@ -9,17 +9,27 @@ using System.Net; using System.Web; using Funq; +using ServiceStack.Configuration; using ServiceStack.Logging; using ServiceStack.Web; namespace ServiceStack.Host.AspNet { public class AspNetRequest - : IHttpRequest + : IHttpRequest, IHasResolver { public static ILog log = LogManager.GetLogger(typeof(AspNetRequest)); - public Container Container { get; set; } + [Obsolete("Use Resolver")] + public Container Container { get { throw new NotSupportedException("Use Resolver"); } } + + private IResolver resolver; + public IResolver Resolver + { + get { return resolver ?? Service.GlobalResolver; } + set { resolver = value; } + } + private readonly HttpRequestBase request; private readonly IHttpResponse response; @@ -70,15 +80,7 @@ public AspNetRequest(HttpContextBase httpContext, string operationName, RequestA public T TryResolve() { - if (typeof(T) == typeof(IHttpRequest)) - throw new Exception("You don't need to use IHttpRequest.TryResolve to resolve itself"); - - if (typeof(T) == typeof(IHttpResponse)) - throw new Exception("Resolve IHttpResponse with 'Response' property instead of IHttpRequest.TryResolve"); - - return Container != null - ? Container.TryResolve() - : HostContext.TryResolve(); + return this.TryResolveInternal(); } public string OperationName { get; set; } diff --git a/src/ServiceStack/Host/BasicRequest.cs b/src/ServiceStack/Host/BasicRequest.cs index 61eb6c894f0..67d536a1388 100644 --- a/src/ServiceStack/Host/BasicRequest.cs +++ b/src/ServiceStack/Host/BasicRequest.cs @@ -9,7 +9,7 @@ namespace ServiceStack.Host { - public class BasicRequest : IRequest + public class BasicRequest : IRequest, IHasResolver { public object Dto { get; set; } public IMessage Message { get; set; } @@ -62,7 +62,7 @@ public string OperationName public T TryResolve() { - return Resolver.TryResolve(); + return this.TryResolveInternal(); } public string UserHostAddress { get; set; } diff --git a/src/ServiceStack/Host/HttpListener/ListenerRequest.cs b/src/ServiceStack/Host/HttpListener/ListenerRequest.cs index 552355ea974..c767eb1ad00 100644 --- a/src/ServiceStack/Host/HttpListener/ListenerRequest.cs +++ b/src/ServiceStack/Host/HttpListener/ListenerRequest.cs @@ -10,13 +10,23 @@ using System.Text; using System.Web; using Funq; +using ServiceStack.Configuration; using ServiceStack.Web; namespace ServiceStack.Host.HttpListener { - public partial class ListenerRequest : IHttpRequest + public partial class ListenerRequest : IHttpRequest, IHasResolver { - public Container Container { get; set; } + [Obsolete("Use Resolver")] + public Container Container { get { throw new NotSupportedException("Use Resolver"); } } + + private IResolver resolver; + public IResolver Resolver + { + get { return resolver ?? Service.GlobalResolver; } + set { resolver = value; } + } + private readonly HttpListenerRequest request; private readonly IHttpResponse response; @@ -44,15 +54,7 @@ public ListenerRequest(HttpListenerContext httpContext, string operationName, Re public T TryResolve() { - if (typeof(T) == typeof(IHttpRequest)) - throw new Exception("You don't need to use IHttpRequest.TryResolve to resolve itself"); - - if (typeof(T) == typeof(IHttpResponse)) - throw new Exception("Resolve IHttpResponse with 'Response' property instead of IHttpRequest.TryResolve"); - - return Container == null - ? HostContext.TryResolve() - : Container.TryResolve(); + return this.TryResolveInternal(); } public string OperationName { get; set; } diff --git a/src/ServiceStack/Host/NetCore/NetCoreRequest.cs b/src/ServiceStack/Host/NetCore/NetCoreRequest.cs index fa9fd7cccb9..5eeac19e107 100644 --- a/src/ServiceStack/Host/NetCore/NetCoreRequest.cs +++ b/src/ServiceStack/Host/NetCore/NetCoreRequest.cs @@ -13,13 +13,21 @@ using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.Primitives; using Microsoft.AspNetCore.Http.Internal; +using ServiceStack.Configuration; namespace ServiceStack.Host.NetCore { - public class NetCoreRequest : IHttpRequest + public class NetCoreRequest : IHttpRequest, IHasResolver { public static ILog log = LogManager.GetLogger(typeof(NetCoreRequest)); + private IResolver resolver; + public IResolver Resolver + { + get { return resolver ?? Service.GlobalResolver; } + set { resolver = value; } + } + private HttpContext context; private HttpRequest request; @@ -36,7 +44,7 @@ public NetCoreRequest(HttpContext context, string operationName, RequestAttribut public T TryResolve() { - return HostContext.TryResolve(); + return this.TryResolveInternal(); } public string GetRawBody() diff --git a/src/ServiceStack/RequestExtensions.cs b/src/ServiceStack/RequestExtensions.cs index b6be58eb9db..b919cea1231 100644 --- a/src/ServiceStack/RequestExtensions.cs +++ b/src/ServiceStack/RequestExtensions.cs @@ -1,6 +1,7 @@ using System; using System.IO; using ServiceStack.Caching; +using ServiceStack.Configuration; using ServiceStack.Host; using ServiceStack.Web; @@ -166,5 +167,18 @@ public static void ReleaseIfInProcessRequest(this IRequest httpReq) httpReq.RequestAttributes = httpReq.RequestAttributes & ~RequestAttributes.InProcess; } + + internal static T TryResolveInternal(this IRequest request) + { + if (typeof(T) == typeof(IRequest)) + return (T)request; + if (typeof(T) == typeof(IResponse)) + return (T)request.Response; + + var hasResolver = request as IHasResolver; + return hasResolver != null + ? hasResolver.Resolver.TryResolve() + : Service.GlobalResolver.TryResolve(); + } } } \ No newline at end of file diff --git a/src/ServiceStack/Testing/MockHttpRequest.cs b/src/ServiceStack/Testing/MockHttpRequest.cs index d6871ef3ed5..4cd76deebda 100644 --- a/src/ServiceStack/Testing/MockHttpRequest.cs +++ b/src/ServiceStack/Testing/MockHttpRequest.cs @@ -4,14 +4,23 @@ using System.IO; using System.Net; using Funq; +using ServiceStack.Configuration; using ServiceStack.Host; using ServiceStack.Web; namespace ServiceStack.Testing { - public class MockHttpRequest : IHttpRequest + public class MockHttpRequest : IHttpRequest, IHasResolver { - public Container Container { get; set; } + [Obsolete("Use Resolver")] + public Container Container { get { throw new NotSupportedException("Use Resolver"); } } + + private IResolver resolver; + public IResolver Resolver + { + get { return resolver ?? Service.GlobalResolver; } + set { resolver = value; } + } public MockHttpRequest() { @@ -20,7 +29,6 @@ public MockHttpRequest() this.QueryString = PclExportClient.Instance.NewNameValueCollection(); this.Cookies = new Dictionary(); this.Items = new Dictionary(); - this.Container = ServiceStackHost.Instance != null ? ServiceStackHost.Instance.Container : new Container(); this.Response = new MockHttpResponse(this); } @@ -45,9 +53,7 @@ public MockHttpRequest() public T TryResolve() { - return Container != null - ? Container.TryResolve() - : HostContext.TryResolve(); + return this.TryResolveInternal(); } public AuthUserSession RemoveSession() diff --git a/tests/ServiceStack.Common.Tests/ContainerTests.cs b/tests/ServiceStack.Common.Tests/ContainerTests.cs index bce112904cc..b0916caa3fe 100644 --- a/tests/ServiceStack.Common.Tests/ContainerTests.cs +++ b/tests/ServiceStack.Common.Tests/ContainerTests.cs @@ -92,8 +92,8 @@ public void CreateInstance_throws_on_missing_dependency() var foo = typeFactory.CreateInstance(services, typeof(IFoo), tryResolve: true); Assert.That(foo, Is.Not.Null); - //var bar = typeFactory.CreateInstance(services, typeof(IBar), tryResolve: true); - //Assert.That(bar, Is.Null); + var bar = typeFactory.CreateInstance(services, typeof(IBar), tryResolve: true); + Assert.That(bar, Is.Null); Assert.Throws(() => typeFactory.CreateInstance(services, typeof(IBar), tryResolve: false));