Skip to content

Instantly share code, notes, and snippets.

@aaronlerch
Last active December 16, 2015 00:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save aaronlerch/5345587 to your computer and use it in GitHub Desktop.
Save aaronlerch/5345587 to your computer and use it in GitHub Desktop.
SignalR IDependencyResolver implementation for Funq/ServiceStack.
using System;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using Funq;
using Microsoft.AspNet.SignalR;
namespace Foo
{
public class FunqDependencyResolver : DefaultDependencyResolver
{
private readonly MethodInfo _tryResolveMethod;
private Container _container;
public FunqDependencyResolver(Container container)
{
_container = container;
FunqDependencyResolver existingResolver = container.TryResolve<IDependencyResolver>() as FunqDependencyResolver;
if (existingResolver != null)
{
existingResolver._container = container;
}
else
{
container.Register<IDependencyResolver>(c => this);
}
_tryResolveMethod = container
.GetType()
.GetMethods()
.First(m => m.Name == "TryResolve" && m.IsGenericMethodDefinition && m.GetGenericArguments().Length == 1);
}
public override object GetService(Type serviceType)
{
var instance = _tryResolveMethod.MakeGenericMethod(serviceType).Invoke(_container, null);
if (instance != null)
{
return instance;
}
return base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
var instance = _tryResolveMethod.MakeGenericMethod(typeof(IEnumerable<>).MakeGenericType(serviceType)).Invoke(_container, null);
if (instance != null)
{
return (IEnumerable<object>)instance;
}
return base.GetServices(serviceType) ?? Enumerable.Empty<object>();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment