使用SignalR和标准MVC控制器的一个依赖性解析器?

时间:2013-10-07 12:21:48

标签: asp.net-mvc-4 unity-container signalr

目前我使用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应用程序中,我现在不想将它们分开。

1 个答案:

答案 0 :(得分:1)

在SignalR中有一篇专门讨论依赖注入的文章:http://www.asp.net/signalr/overview/extensibility/dependency-injection

所以你要做的就是为SignalR编写一个自定义依赖项解析器,它显然是你共享的Unity容器的一个简单包装器。