vista ventajas tutorial pagina net mvc modelo example establecer ejemplos controlador asp asp.net-mvc-3 dependency-injection structuremap signalr signalr-hub

asp.net mvc 3 - ventajas - Preguntas de inyección de dependencia SignalR+



tutorial asp net mvc (4)

Estoy usando SignalR en mi aplicación MVC3, y como he implementado la inyección de dependencia de StructureMap en mis controladores, me gustaría hacer lo mismo en mi concentrador, pero parece que no puedo hacerlo funcionar.

Por favor, dime qué está mal con mis códigos a continuación:

SignalRSmDependencyResolver.cs

public class SignalRSmDependencyResolver : DefaultDependencyResolver { private IContainer _container; public SignalRSmDependencyResolver(IContainer container) { _container = container; } public override object GetService(Type serviceType) { object service = null; if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) { // Concrete type resolution service = _container.GetInstance(serviceType); } else { // Other type resolution with base fallback service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType); } return service; } public override IEnumerable<object> GetServices(Type serviceType) { var objects = _container.GetAllInstances(serviceType).Cast<object>(); objects.Concat(base.GetServices(serviceType)); return objects; } }

SignalRExtensionsRegistry.cs

public class SignalRExtensionsRegistry : Registry { public SignalRExtensionsRegistry() { For<IDependencyResolver>().Add<SignalRSmDependencyResolver>(); } }

IoC.cs

public static class IoC { public static IContainer Initialize() { var container = BootStrapper.Initialize(); container.Configure(x => { x.For<IControllerActivator>().Singleton().Use<StructureMapControllerActivator>(); }); return container; } } public class StructureMapControllerActivator : IControllerActivator { public StructureMapControllerActivator(IContainer container) { _container = container; } private IContainer _container; public IController Create(RequestContext requestContext, Type controllerType) { IController controller = DependencyResolver.Current.GetService(controllerType) as IController; return controller; } }

AppStart_Structuremap.cs

[assembly: WebActivator.PreApplicationStartMethod(typeof(StoreUI.AppStart_Structuremap), "Start")] namespace MyNameSpace { public static class AppStart_Structuremap { public static void Start() { var container = (IContainer) IoC.Initialize(); DependencyResolver.SetResolver(new StructureMapDependenceyResolver(container)); AspNetHost.SetResolver(new StructureMapDependencyResolver(container)); } } }

NotificacionesHub.cs

[HubName("notificationsHub")] public class NotificationsHub : Hub { #region Declarations private readonly IUserService userService; #endregion #region Constructor public NotificationsHub(IUserService userService) { this.userService = userService; } #endregion public void updateServer(string message) { Clients.updateClient(message); } }

Gracias



Agrega algo como esto a un archivo en tu carpeta App_Start. Este fragmento de código es para Ninject, así que simplemente reemplaza AspNetHost.SetResolver ()

using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Ninject; using SignalR.Hosting.AspNet; using SignalR.Infrastructure; using SignalR.Ninject; using Web.Models; [assembly: WebActivator.PreApplicationStartMethod(typeof(Web.App_Start.NinjectSignalR), "Start")] namespace Web.App_Start { public static class NinjectSignalR { public static void Start() { IKernel kernel = CreateKernel(); // switch this line to the structuremap resolver AspNetHost.SetResolver(new NinjectDependencyResolver(kernel)); } private static IKernel CreateKernel() { var kernel = new StandardKernel(); RegisterServices(kernel); return kernel; } private static void RegisterServices(IKernel kernel) { // add your services here //kernel.Bind<IRepository>().To<Repository>(); } } }


Conseguir Structuremap en SignalR es bastante sencillo. Primero quieres crear tu propio resolutor:

StructureMap Resolver

Usos:

using SignalR.Infrastructure; using StructureMap;

Clase:

public class StructureMapResolver : DefaultDependencyResolver { private IContainer _container; public StructureMapResolver(IContainer container) { _container = container; } public override object GetService(Type serviceType) { object service = null; if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass) { // Concrete type resolution service = _container.GetInstance(serviceType); } else { // Other type resolution with base fallback service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType); } return service; } public override IEnumerable<object> GetServices(Type serviceType) { var objects = _container.GetAllInstances(serviceType).Cast<object>(); return objects.Concat(base.GetServices(serviceType)); } }

La idea aquí es probar y usar su contenedor para resolver las dependencias, si no tiene la dependencia conectada, pásela al resolutor predeterminado. De esta manera, no tiene que preocuparse por todas las demás dependencias en SignalR y puede centrarse solo en las cosas que desea inyectar (concentradores, ConnectionIdFactory, MessageBus, etc.).

Encuadernaciones para Resolver y Hub

A continuación, querrá registrar esto en su contenedor (me gusta usar registros):

Usos:

using SignalR.Infrastructure; using StructureMap.Configuration.DSL;

Clase:

public class ExtensionsRegistry : Registry { public ExtensionsRegistry() { For<IDependencyResolver>().Add<StructureMapResolver>(); } }

Reemplazo de resolución

Finalmente, querrá decirle a SignalR que use su resolutor en lugar del predeterminado:

Global :: Application_Start o WebActivator :: Pre_Start

Usos:

using SignalR.Hosting.AspNet; using SignalR.Infrastructure;

Inicio de aplicación:

// Make sure you build up the container first AspNetHost.SetResolver(StructureMap.ObjectFactory.GetInstance<IDependencyResolver>());

Silly Hub con dependencias inyectadas.

Ahora puede simplemente inyectar cualquier dependencia que su contenedor conozca en los centros:

[HubName("defaultHub")] public class DefaultHub : Hub, IDisconnect { private readonly IRepository _repo; public DefaultHub(IRepository repo) { _repo = repo; } public void Connect() { Caller.setUser(Context.ConnectionId); Clients.addMessage(string.Format("{0} has connected", Context.ConnectionId)); } public void MessageSender(string message) { Caller.addMessage(_repo.RepositoryMessage()); Clients.addMessage(message); } public Task Disconnect() { var clientId = this.Context.ConnectionId; return Task.Factory.StartNew(() => { Clients.addMessage(string.Format("{0} has disconnected", clientId)); }); } }


Sé que este es un tema antiguo, pero para aquellos que se preguntan dónde está el AspNetHost.SetResolver en la versión más reciente de signalR, puede usar esto en App_Start StructuremapMvc.cs:

public static void Start() { IContainer container = IoC.Initialize(); GlobalHost.DependencyResolver = new SignalRSmDependencyResolver(container); // for signalR DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container); }