为SignalR创建Unity DependencyResolver

时间:2012-07-06 07:57:33

标签: unity-container signalr

我正在使用SignalR 0.5.2,我正在尝试使用Unity设置DependencyResolver。我写了最简单的代码。我有一个我试图注入的集线器,如下所示:

public class SimpleHub : Hub
{
    private readonly ITestService _service;

    public SimpleHub(ITestService service)
    {
        _service = service;
    }

    public void Update()
    {
        Clients.callback("Kevin");
    }
}

和一个看起来像这样的DependencyResolver:

public class UnityDependencyResolver : DefaultDependencyResolver
{
    private readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        _container = container;
    }

    public override object GetService(Type serviceType)
    {
        if (_container.IsRegistered(serviceType))
        {
            return _container.Resolve(serviceType);
        }
        return base.GetService(serviceType);
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        if (_container.IsRegistered(serviceType))
        {
            return _container.ResolveAll(serviceType);
        }
        return base.GetServices(serviceType);
    }
}

我在Global.asax中注册了依赖项解析器

protected void Application_Start()
{
    IUnityContainer container = new UnityContainer();
    InitializeContainer(container);
    SignalR.IDependencyResolver resolver = new UnityDependencyResolver(container);
    GlobalHost.DependencyResolver = resolver;
    RouteTable.Routes.MapHubs();
    // more MVC stuff here
}

其中InitializeContainer在Unity中注册ITestService

解析器“工作”,因为它被调用所有SignalR类型,如果我使用默认构造函数离开我的集线器,它就会被加载。但是,永远不会要求解析器解析ITestService接口。

我也尝试将解析器传递给MapHubs,但仍然没有运气。我也尝试使用[Dependency]属性进行属性注入,但这也没有用。

我是否还需要向MVC注册解析器? (我试过通过实现两个IDependecyResolver接口但是得到一个异常告诉我解析器没有实现IServiceLocator)

2 个答案:

答案 0 :(得分:2)

所以我解决了这个问题。我想知道Hub是否在信号器容器中注册并且接口是在Unity容器中注册的事实导致了这个问题。所以我用Unity注册了Hub,然后一切正常。

这种情况很有意义,因为有两个容器。

这是标准行为吗?

答案 1 :(得分:1)

如果其他人想知道......我找到了一个使用

的好SPA示例
  • SignalR 1.0.1
  • Unity 3
  • 一堆其他框架

有趣的是他创建容器,依赖项和其他所有东西的方式。值得checking it out