gpt4 book ai didi

asp.net-mvc-3 - SignalR + 依赖注入(inject)问题

转载 作者:行者123 更新时间:2023-12-03 04:45:01 25 4
gpt4 key购买 nike

我在我的 MVC3 应用程序中使用 SignalR,并且由于我已经在我的 Controller 上实现了 StructureMap 依赖注入(inject),我想在我的集线器中执行相同的操作,但我似乎无法让它工作。

请告诉我下面的代码有什么问题:

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));
}
}
}

NotificationsHub.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);
}
}

谢谢

最佳答案

将 Structuremap 导入 SignalR 实际上非常简单。首先,您要创建自己的解析器:

结构图解析器

用途:

using SignalR.Infrastructure;
using StructureMap;

类(class):

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));
}
}

这里的想法是尝试使用您的容器来解析依赖项,如果您没有连接依赖项,请将其传递给默认解析器。这样您就不必担心 SignalR 中的所有其他依赖项,而可以只关注您想要注入(inject)的内容(集线器、ConnectionIdFactory、MessageBus 等)。

解析器和集线器的绑定(bind)

接下来,您需要在容器中注册它(我喜欢使用注册表):

用途:

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

类(class):

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

旋转变压器更换

最后,您需要告诉 SignalR 使用您的解析器而不是默认解析器:

Global::Application_Start 或 WebActivator::Pre_Start

用途:

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

Application_Start:

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

带有注入(inject)依赖项的愚蠢集线器

现在您可以将容器知道的任何依赖项注入(inject)集线器本身:

[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)); });
}
}

关于asp.net-mvc-3 - SignalR + 依赖注入(inject)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9790433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com