使用Unity IoC注册和解决SignalR集线器 [英] Using Unity IoC to register and resolve SignalR hubs
问题描述
// Repositories
container.RegisterType< ChatMessageRepository>(new PerRequestLifetimeManager());
container.RegisterType< SignalRConnectionRepository>(new PerRequestLifetimeManager());
//上下文
container.RegisterType< IPrincipal,Principal>(new PerRequestLifetimeManager());
container.RegisterType< IDatabaseFactory,DatabaseFactory>(new PerRequestLifetimeManager());
container.RegisterType< UnitOfWork>(new PerRequestLifetimeManager());
逻辑上,我试图以同样的方式注册我的Hub。
container.RegisterType< ChatHub>(new PerRequestLifetimeManager());
然而,每当我运行我的应用程序并离开聊天页面,我得到一个依赖关系失败异常,InnerException告诉我由于对象的当前状态,操作无效。我也尝试使用默认(Transient),PerResolve和ContainerControlled终身Unity管理器注册这些家伙,似乎无法解决我的问题。
有人可以为我提供一些演示代码,您如何在ASP.NET MVC应用程序中使用Unity来处理依赖注入到您的信号中枢?
这里是Unity将注入参数到我的SignalR Hub
public class ChatHub:Hub
{
private readonly ChatMessageRepository _chatMessageRepository;
private readonly SignalRConnectionRepository _signalRConnectionRepository;
私有readonly UnitOfWork _unitOfWork;
public ChatHub(ChatMessageRepository chatMessageRepository,
SignalRConnectionRepository signalRConnectionRepository,
UnitOfWork unitOfWork)
{
_chatMessageRepository = chatMessageRepository;
_signalRConnectionRepository = signalRConnectionRepository;
_unitOfWork = unitOfWork;
} ...
谢谢!
三步执行
首先。创建UnityHubActivator类
public class UnityHubActivator:IHubActivator
{
private readonly IUnityContainer _container;
public UnityHubActivator(IUnityContainer container)
{
_container = container;
}
public IHub创建(HubDescriptor描述符)
{
return(IHub)_container.Resolve(descriptor.HubType);
}
}
第二。创建Unity容器并注册您的依赖关系解析器,然后运行Startup类
unityContainer = new UnityContainer();
var unityHubActivator = new UnityHubActivator(_unityContainer);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator),()=> unityHubActivator);
//在容器中注册一些类型
WebApp.Start< Startup>(startOptions);
第三。在您的Hub中使用它
public class MyHub:Hub
{
public MyHub(Logger logger)
{
logger.Info(hub constructor);
}
}
注意。我的启动课程没有改变任何东西
I think I'm missing something very simple and maybe just need a new set of eyes. I have an ASP.NET MVC application. In that app, I am using Unity for my IoC to handle dependency injection. Each of my repositories need to have a database factory injected into it and each database factory needs to have a principal injected into it. So far, I've been utilizing the PerRequestLifetimeManager to register these.
//Repositories
container.RegisterType<ChatMessageRepository>(new PerRequestLifetimeManager());
container.RegisterType<SignalRConnectionRepository>(new PerRequestLifetimeManager());
//Context
container.RegisterType<IPrincipal, Principal>(new PerRequestLifetimeManager());
container.RegisterType<IDatabaseFactory, DatabaseFactory>(new PerRequestLifetimeManager());
container.RegisterType<UnitOfWork>(new PerRequestLifetimeManager());
Logically, I've tried to register my Hub in the same fashion.
container.RegisterType<ChatHub>(new PerRequestLifetimeManager());
However, whenever I run my app and navigate away from my chat page, I get a "Resolution of the dependency failed" exception and the InnerException tells me "Operation is not valid due to the current state of the object." I've also tried using the default (Transient), PerResolve, and ContainerControlled lifetime Unity managers when registering these guys and cannot seem to get resolve my issue.
Could someone just provide me some demo code with how you used Unity in an ASP.NET MVC application to handle dependency injection into your signalr hubs?
Here's where Unity will inject parameters into my SignalR Hub
public class ChatHub : Hub
{
private readonly ChatMessageRepository _chatMessageRepository;
private readonly SignalRConnectionRepository _signalRConnectionRepository;
private readonly UnitOfWork _unitOfWork;
public ChatHub(ChatMessageRepository chatMessageRepository,
SignalRConnectionRepository signalRConnectionRepository,
UnitOfWork unitOfWork)
{
_chatMessageRepository = chatMessageRepository;
_signalRConnectionRepository = signalRConnectionRepository;
_unitOfWork = unitOfWork;
} ... }
Thanks!
Do it in 3 steps
First. Create UnityHubActivator class
public class UnityHubActivator : IHubActivator
{
private readonly IUnityContainer _container;
public UnityHubActivator(IUnityContainer container)
{
_container = container;
}
public IHub Create(HubDescriptor descriptor)
{
return (IHub)_container.Resolve(descriptor.HubType);
}
}
Second. Create Unity container and register your dependency resolver before run Startup class
unityContainer = new UnityContainer();
var unityHubActivator = new UnityHubActivator(_unityContainer);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => unityHubActivator);
//register some types in container
WebApp.Start<Startup>(startOptions);
Third. Use it in your Hub
public class MyHub : Hub
{
public MyHub(Logger logger)
{
logger.Info("hub constructor");
}
}
Note. I do not change anything in my Startup class
这篇关于使用Unity IoC注册和解决SignalR集线器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!