Pregunta Utilizando un contenedor IoC existente en SignalR 2.0


¿Cómo puedo usar un IoC existente con SignalR 2.0?

Desde el tutorial, parece que necesito configurar una clase para ser llamado desde OWIN a través de un atributo:

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app /*HOW AM I GONNA GET UNITY CONTAINER HERE?*/) 
        {
            var hubConfig = new HubConfiguration()
            {
                EnableJSONP = true,
                EnableDetailedErrors = true,
                EnableJavaScriptProxies = true,
                Resolver = new SignalRUnityDependencyResolver(container)  
            };


            // Any connection or hub wire up and configuration should go here
            app.MapSignalR(hubConfig);
        }
    }
}

El problema aquí es que ya tengo un contenedor, que es de arranque y hay instancias únicas en el contenedor que deben compartirse con la aplicación MVC compartida en el mismo host.

Sin embargo, el problema aquí es que, a diferencia del anterior, no parece que pueda llamar al MapSignalR método de mi propio código. Más bien necesito confiar en OWIN para hacer esto por mí. Sin embargo, OWIN no conoce el contenedor que ya configuré.

¿Cuál es la mejor manera de resolver esto? Tengo algunas ideas muy crudas de cómo hackear una solución usando variables estáticas para contener algunas de ellas, pero odio pensar en ello. El código será frágil y el orden de operación podría introducir fácilmente un error sutil.

¿Hay alguna forma de obtener la instancia de IAppBuilder sin que OWIN invoque el método anterior? De esta forma puedo controlar mejor cuando SignalR se inicializa y puedo pasar mi propio IoC a la configuración.


5
2017-11-04 06:57


origen


Respuestas:


En mi caso, he creado un activador de hub personalizado que usa un contenedor compartido entre mi aplicación y signalR (por inyección de constructor) de esa manera tendrás una raíz compuesta única para toda la aplicación.

intente lo siguiente:

public class CustomHubActivator : IHubActivator
    {
        private readonly Container _container;

        public MseHubActivator(Container container)
        {
            _container = container;
        }

        public IHub Create(HubDescriptor descriptor)
        {
            return _container.GetInstance(descriptor.HubType) as IHub;
        }
    }

registre su activador de concentrador personalizado cuando esté iniciando su aplicación (tal vez el archivo.asax global)

 GlobalHost.DependencyResolver.Register(typeof (IHubActivator),
                                                   () => new CustomHubActivator(Container));

esa es una solución mucho más simple en lugar de volver a configurar la dependencia de la señalR.


7
2017-11-04 17:24