无法让Unity3和SignalR 2.0协同工作

时间:2014-01-04 18:58:21

标签: c# signalr unity-container

我尝试与Unity3一起实现SignalR 2.0,但到目前为止没有成功,没有例外或错误。此外,断点也不会受到影响,所以很难调试并弄清楚我做错了什么。

我把这个网页作为例子: http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection 但是用ninject取代了统一。

这是我的代码。

我有一个startUp类:

[assembly: OwinStartup(typeof(Hubs.StartUp))]
namespace Hubs
{
    public class StartUp
    {
        public void Configuration(IAppBuilder app)
        {
            var configuration = new HubConfiguration //I put a breakpoint here
            {
                Resolver = GetResolver()
            };

            app.MapSignalR(configuration);
        }

        private static IDependencyResolver GetResolver()
        {
            var container = new UnityContainer(); //I put a breakpoint here
            Validations.IoC.Initialize(container);
            return new UnityDependencyResolver(container);
        }
    }
}

UnityDependencyResolver类:

namespace Hubs
{
    public class UnityDependencyResolver : DefaultDependencyResolver
    {
        private readonly IUnityContainer _container;

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

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

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

使用构造函数依赖注入的集线器类

namespace Hubs.Hubs
{
    public class TestHub : Hub
    {
        private readonly ISomeValidation _validation;

        public TestHub(ISomeValidation validation)
        {
            _validation = validation;
        }

        public SomeObject Get()
        {
            return _validation.Get();
        }
    }
}

还有Validations.IoC类

public static class IoC
{
    public static void Initialize(UnityContainer container)
    {
        container.RegisterType<ISomeValidation, SomeValidation>();
    }
}

我无法弄清楚我做错了什么,所以有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

经过一番搜索后,我想我可能会找到问题的原因。似乎有一个默认的依赖项解析器试图解析集线器类但无法执行它,这是有道理的因为我没有注册集线器类。

我相信在ninject示例中,注册发生在这段代码中:

kernel.Bind<IHubConnectionContext>().ToMethod(context =>
        resolver.Resolve<IConnectionManager>().GetHubContext<StockTickerHub>().Clients
    ).WhenInjectedInto<IStockTicker>();

不确定,因为我从未对ninject做过任何事情。我无法弄清楚如何将其转换为Unity代码。

经过一些搜索后,我在此处找到了另一个代码示例:http://damienbod.wordpress.com/2013/11/05/using-signalr-with-unity/

这实际上是有效的。它还包含了hub类型的注册,因此它可能解决了我的问题。