Skip to content

Commit

Permalink
Implement IHasResolver and change all IRequest to use shared TryResol…
Browse files Browse the repository at this point in the history
…verInternal
  • Loading branch information
mythz committed Oct 6, 2016
1 parent 0672aa2 commit 501ad4c
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 34 deletions.
Binary file modified lib/ServiceStack.Interfaces.dll
Binary file not shown.
5 changes: 5 additions & 0 deletions src/ServiceStack.Interfaces/Configuration/IResolver.cs
Expand Up @@ -9,4 +9,9 @@ public interface IResolver
/// <returns></returns>
T TryResolve<T>();
}

public interface IHasResolver
{
IResolver Resolver { get; }
}
}
24 changes: 13 additions & 11 deletions src/ServiceStack/Host/AspNet/AspNetRequest.cs
Expand Up @@ -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;

Expand Down Expand Up @@ -70,15 +80,7 @@ public AspNetRequest(HttpContextBase httpContext, string operationName, RequestA

public T TryResolve<T>()
{
if (typeof(T) == typeof(IHttpRequest))
throw new Exception("You don't need to use IHttpRequest.TryResolve<IHttpRequest> to resolve itself");

if (typeof(T) == typeof(IHttpResponse))
throw new Exception("Resolve IHttpResponse with 'Response' property instead of IHttpRequest.TryResolve<IHttpResponse>");

return Container != null
? Container.TryResolve<T>()
: HostContext.TryResolve<T>();
return this.TryResolveInternal<T>();
}

public string OperationName { get; set; }
Expand Down
4 changes: 2 additions & 2 deletions src/ServiceStack/Host/BasicRequest.cs
Expand Up @@ -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; }
Expand Down Expand Up @@ -62,7 +62,7 @@ public string OperationName

public T TryResolve<T>()
{
return Resolver.TryResolve<T>();
return this.TryResolveInternal<T>();
}

public string UserHostAddress { get; set; }
Expand Down
24 changes: 13 additions & 11 deletions src/ServiceStack/Host/HttpListener/ListenerRequest.cs
Expand Up @@ -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;

Expand Down Expand Up @@ -44,15 +54,7 @@ public ListenerRequest(HttpListenerContext httpContext, string operationName, Re

public T TryResolve<T>()
{
if (typeof(T) == typeof(IHttpRequest))
throw new Exception("You don't need to use IHttpRequest.TryResolve<IHttpRequest> to resolve itself");

if (typeof(T) == typeof(IHttpResponse))
throw new Exception("Resolve IHttpResponse with 'Response' property instead of IHttpRequest.TryResolve<IHttpResponse>");

return Container == null
? HostContext.TryResolve<T>()
: Container.TryResolve<T>();
return this.TryResolveInternal<T>();
}

public string OperationName { get; set; }
Expand Down
12 changes: 10 additions & 2 deletions src/ServiceStack/Host/NetCore/NetCoreRequest.cs
Expand Up @@ -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;

Expand All @@ -36,7 +44,7 @@ public NetCoreRequest(HttpContext context, string operationName, RequestAttribut

public T TryResolve<T>()
{
return HostContext.TryResolve<T>();
return this.TryResolveInternal<T>();
}

public string GetRawBody()
Expand Down
14 changes: 14 additions & 0 deletions 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;

Expand Down Expand Up @@ -166,5 +167,18 @@ public static void ReleaseIfInProcessRequest(this IRequest httpReq)

httpReq.RequestAttributes = httpReq.RequestAttributes & ~RequestAttributes.InProcess;
}

internal static T TryResolveInternal<T>(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<T>()
: Service.GlobalResolver.TryResolve<T>();
}
}
}
18 changes: 12 additions & 6 deletions src/ServiceStack/Testing/MockHttpRequest.cs
Expand Up @@ -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()
{
Expand All @@ -20,7 +29,6 @@ public MockHttpRequest()
this.QueryString = PclExportClient.Instance.NewNameValueCollection();
this.Cookies = new Dictionary<string, Cookie>();
this.Items = new Dictionary<string, object>();
this.Container = ServiceStackHost.Instance != null ? ServiceStackHost.Instance.Container : new Container();
this.Response = new MockHttpResponse(this);
}

Expand All @@ -45,9 +53,7 @@ public MockHttpRequest()

public T TryResolve<T>()
{
return Container != null
? Container.TryResolve<T>()
: HostContext.TryResolve<T>();
return this.TryResolveInternal<T>();
}

public AuthUserSession RemoveSession()
Expand Down
4 changes: 2 additions & 2 deletions tests/ServiceStack.Common.Tests/ContainerTests.cs
Expand Up @@ -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<ResolutionException>(() =>
typeFactory.CreateInstance(services, typeof(IBar), tryResolve: false));
Expand Down

0 comments on commit 501ad4c

Please sign in to comment.