目前我使用Unity 3.x作为我的IoC。我还使用Unity.MVC4库来帮助管理我的解析器的生命周期。这是我的解析器的样子:
namespace Wfm.Core.Common.Mvc.Unity
{
public class WfmDependencyResolver : UnityDependencyResolver
{
public WfmDependencyResolver(IUnityContainer container) : base(container)
{
}
private static WfmDependencyResolver _wfmGrabbrResolver;
public static WfmDependencyResolver Instance { get { return _wfmGrabbrResolver ?? (_wfmGrabbrResolver = new WfmDependencyResolver(InstanceLocator.Instance.Container)); } }
}
}
UnityDependencyResolver
来自Unity.MVC4库。在我的Globabl.asax.cs文件中,我设置了这样的解析器:
DependencyResolver.SetResolver(WfmDependencyResolver.Instance);
这是我的单例InstanceLocator类:
public class InstanceLocator
{
private static InstanceLocator _instance;
public IUnityContainer Container { get; private set; }
private InstanceLocator()
{
Container = new UnityContainer();
}
public static InstanceLocator Instance
{
get { return _instance ?? (_instance = new InstanceLocator()); }
}
public T Resolve<T>()
{
try
{
return WfmDependencyResolver.Instance.GetService<T>();
}
catch(Exception ex)
{
return default(T);
}
}
public T ResolvewithoutManager<T>()
{
try
{
return Container.Resolve<T>();
}
catch (Exception)
{
throw;
}
}
}
这显然适用于我的MVC控制器,但是什么是一个很好的解决方案,允许我的应用程序在我的Hub控制器和我的MVC控制器内解析。目前,我创建了一个单例类,允许我手动解析我的类型。我可以使用我的类来专门解决我的Hubs中的类型:
InstanceLocator.Instance.Resolve<ISomeInterface>();
虽然这有效,但从发展的角度来看并不理想。原因是,我希望我的类型被注入而不是手动实例化。我的集线器和控制器都在同一个MVC应用程序中,我现在不想将它们分开。
答案 0 :(得分:1)
在SignalR中有一篇专门讨论依赖注入的文章:http://www.asp.net/signalr/overview/extensibility/dependency-injection
所以你要做的就是为SignalR编写一个自定义依赖项解析器,它显然是你共享的Unity容器的一个简单包装器。