我正在使用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)
答案 0 :(得分:2)
所以我解决了这个问题。我想知道Hub是否在信号器容器中注册并且接口是在Unity容器中注册的事实导致了这个问题。所以我用Unity注册了Hub,然后一切正常。
这种情况很有意义,因为有两个容器。
这是标准行为吗?
答案 1 :(得分:1)
如果其他人想知道......我找到了一个使用
的好SPA示例有趣的是他创建容器,依赖项和其他所有东西的方式。值得checking it out。