3

我正在使用 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)

4

2 回答 2

2

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

因为有两个容器,所以这种方法很有意义。

这是标准行为吗?

于 2012-07-07T16:06:57.393 回答
1

万一其他人想知道...我找到了一个很好的 SPA 示例,它使用

  • SignalR 1.0.1
  • 团结 3
  • 一堆其他框架

有趣的是他创建容器、依赖项和其他所有内容的方式。值得一

于 2013-09-06T13:00:26.200 回答