我正在使用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)
container.RegisterType<SimpleHub, SimpleHub>();
。 - vladimir