使用Unity IoC注册和解决SignalR集线器 [英] Using Unity IoC to register and resolve SignalR hubs

查看:555
本文介绍了使用Unity IoC注册和解决SignalR集线器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我认为我错过了很简单的东西,也许只是需要一套新的眼睛。我有一个ASP.NET MVC应用程序。在该应用程序中,我使用Unity为我的IoC处理依赖注入。我的每个存储库都需要注入数据库工厂,每个数据库工厂都需要注入一个主体。到目前为止,我一直在使用PerRequestLifetimeManager注册这些。

  // 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆