为SignalR创建Unity DependencyResolver

3

我正在使用SignalR 0.5.2,尝试使用Unity建立DependencyResolver。我编写了最简单的代码。我有一个hub需要注入,代码如下:

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类型调用,如果我将我的hub使用默认构造函数加载,它就可以正常运行。但是,解析器从未被要求解析ITestService接口。

我还尝试将解析器传递给MapHubs,但仍然没有成功。我还尝试使用[Dependency]属性进行属性注入,但也不起作用。

我需要在MVC中注册解析器吗?(我已经通过实现IDependecyResolver接口来尝试过这样做,但是会出现异常,告诉我解析器没有实现IServiceLocator)

2个回答

2

我已经解决了这个问题。我想知道Hub注册到Signalr容器,接口注册到Unity容器是否导致了问题。因此,我将Hub注册到Unity中,然后一切正常。

这似乎是有道理的,因为存在两个容器。

这是标准行为吗?


1
这是有意为之的。如果你考虑一下,你设置了你想要由容器创建的东西,让其他所有东西都落在默认容器上。如果你将东西注入到一个中心,则需要注册你的中心(尽管像Ninject这样的神奇DI容器会自动完成:))。请参见JabbR https://github.com/davidfowl/JabbR/blob/master/JabbR/App_Start/Bootstrapper.cs#L51和Ninject实现https://github.com/SignalR/SignalR.Ninject/blob/master/SignalR.Ninject/NinjectDependencyResolver.cs - davidfowl
谢谢David,我想那就是情况。 - Kevin Jones
1
换句话说,在Application_Start()中需要添加container.RegisterType<SimpleHub, SimpleHub>(); - vladimir

1

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

  • SignalR 1.0.1
  • Unity 3
  • 一堆其他框架

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接