asp.net-mvc-3 – SignalR依赖注入问题
发布时间:2020-12-15 18:39:50 所属栏目:asp.Net 来源:网络整理
导读:我在我的MVC3应用程序中使用SignalR,并且由于我已经在我的控制器上实现了StructureMap依赖注入,所以我想在我的中心做同样的事情,但是我似乎无法使其工作。 请告诉我我的代码如下: SignalRSmDependencyResolver.cs public class SignalRSmDependencyResol
|
我在我的MVC3应用程序中使用SignalR,并且由于我已经在我的控制器上实现了StructureMap依赖注入,所以我想在我的中心做同样的事情,但是我似乎无法使其工作。
请告诉我我的代码如下: 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));
}
}
}
通知书 [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其实很简单。首先要创建自己的解析器:
StructureMap Resolver 用途: using SignalR.Infrastructure; using StructureMap; 类: 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中的所有其他依赖项,只能将注意力集中到(Hubs,ConnectionIdFactory,MessageBus等)上。 解决方案和集线器的绑定 接下来,您将要在容器中注册(我喜欢使用注册表): 用途: using SignalR.Infrastructure; using StructureMap.Configuration.DSL; 类: 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>()); Silly Hub与注入的依赖关系 现在,您可以将容器知道的任何依赖项注入到集线器本身中: [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 – 为什么GridView在回发后不会将标题行
- ASP.NET表单认证在iPad上显示登录页面
- ASP.NET性能:没有预编译的Web应用程序
- asp.net-mvc – 如何使用ASP.NET MVC实现自定义缓
- asp.net-mvc – MVC 4 Ajax.beginform提交 – 导
- asp.net-mvc-3 – “字段宽度必须是数字.”在客户
- asp.net – specflow的.msi安装程序和它的nuget包
- asp.net-mvc – 用于表单提交和即时结果显示的良
- asp.net:response.redirect无法正常工作
- asp.net-mvc – 为什么在视图引擎中指定位置时,v
热点阅读
