asp.net-mvc-3 – SignalR依赖注入问题
|
我在我的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 OnClientClick =“return false;”不起作用
- asp.net – IIS 7.0和IIS 7.5之间有什么区别?
- asp.net – 从中等信任环境的Web.config读取system.net/mai
- asp.net – html脚本标签不使用类型javascript?
- iis – w3wp.exe占用内存
- asp.net-mvc – 未找到MVC 6 404
- asp.net – 在实体框架中使用PersianCalendar作为表列的正确
- asp.net-mvc – 处理onchange事件在HTML.DropDownList Razo
- asp.net-mvc – 为什么我不能在ASP.NET MVC 3中使用HtmlDec
- asp.net – 您有任何免费的.Net托管代码将DocX转换为PDF?
- ASP.NET MVC 4 JSON绑定到视图模型 – 嵌套对象错
- asp.net-mvc – 在MVC SignalR服务器和Windows服
- asp.net – 通过Web请求从设备获取唯一的静态ID
- 如何在asp.net中检测新的Microsoft浏览器“Edge”
- asp.net-mvc-3 – 如何在MVC3中限制FileUpload中
- asp.net – 找不到可安装的ISAM. ‘/’应用程序中
- asp.net-web-api – 返回Web API中的错误
- asp.net – 如何添加jQuery UI按钮图标到输入按钮
- asp.net – 添加新行到datatable的顶部
- 当“必须”我使用asp.net CreateChildControls()
