我正在使用SignalR 0.5.2,並試圖使用Unity設置DependencyResolver。我寫了最簡單的代碼。我有我試圖注入該集線器看起來像這樣:爲SignalR創建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註冊ITestService在Unity
解析器「工作s「,因爲它會調用所有的SignalR類型,如果我使用默認構造函數離開我的中心,它將全部加載。然而,解析器永遠不會被要求解析ITestService接口。
我也試過將解析器傳遞給MapHubs,仍然沒有運氣。我也嘗試使用[Dependency]屬性進行屬性注入,但這也不起作用。
我是否需要向MVC註冊解析器? (我試圖通過實現兩個IDependecyResolver接口,但得到一個異常告訴我解析器沒有實現IServiceLocator)
這是設計。如果你仔細想想,你可以設置你想要由容器創建的東西,並讓其他所有東西落在默認容器上。如果你把東西注入集線器,那麼你需要註冊你的集線器(tho真棒DI容器,像ninject自動做:))。請參閱JabbR https://github.com/davidfowl/JabbR/blob/master/JabbR/App_Start/Bootstrapper.cs#L51和Ninject impl https://github.com/SignalR/SignalR.Ninject/blob/master/SignalR。 Ninject/NinjectDependencyResolver.cs – davidfowl 2012-07-07 21:02:56
感謝大衛,我認爲是這種情況 – 2012-07-08 14:17:22
換句話說,需要將'container.RegisterType();'添加到Application_Start()。 –
vladimir77
2013-06-28 11:07:52