Asp.net mvc 4 ASP.NET MVC 4后台操作
我正在为ASP.NET MVC 4后台操作寻找漂亮而优雅的体系结构解决方案 我的目标是建立一个自己生活的世界,客户只能与之互动。现在让我们假设它将是一个简单的时钟,客户可以在它上面观看 现在我有了WebBackrounder+信号机软件包 韦伯·克鲁德:Asp.net mvc 4 ASP.NET MVC 4后台操作,asp.net-mvc-4,background,signalr,Asp.net Mvc 4,Background,Signalr,我正在为ASP.NET MVC 4后台操作寻找漂亮而优雅的体系结构解决方案 我的目标是建立一个自己生活的世界,客户只能与之互动。现在让我们假设它将是一个简单的时钟,客户可以在它上面观看 现在我有了WebBackrounder+信号机软件包 韦伯·克鲁德: [assembly: PostApplicationStartMethod(typeof(WebBackgrounderSetup), "Start")] [assembly: ApplicationShutdownMethod(typeof(
[assembly: PostApplicationStartMethod(typeof(WebBackgrounderSetup), "Start")]
[assembly: ApplicationShutdownMethod(typeof(WebBackgrounderSetup), "Shutdown")]
namespace LibcanvasStudy.App_Start
{
public static class WebBackgrounderSetup
{
static readonly JobManager _jobManager = CreateJobWorkersManager();
public static RedrawJob RedrawJob { get; private set; }
public static void Start()
{
_jobManager.Start();
}
public static void Stop()
{
_jobManager.Stop();
}
public static void Shutdown()
{
_jobManager.Dispose();
}
private static JobManager CreateJobWorkersManager()
{
RedrawJob = new RedrawJob(TimeSpan.FromSeconds(1));
var manager = new JobManager(new[] { RedrawJob }, new JobHost());
return manager;
}
}
当作业执行上升事件且信号器集线器捕捉到它时,重新绘制作业:
public class CanvasHub : Hub
{
public CanvasHub()
{
if (WebBackgrounderSetup.RedrawJob != null)
WebBackgrounderSetup.RedrawJob.Executing += (sender, args) => Request(args);
}
public void Request(RedrawEventArgs eventArgs)
{
Clients.All.redraw(...);
}
}
我现在有一个主要问题-如何从我的JobManager中动态添加和删除作业
我也不喜欢这个工作事件系统,对我来说有点尴尬。有什么建议吗?达林说的是正确的,但可以解决。例如,对于此类场景,我所做的是使用一个内部WCF服务来处理所有作业,您可以使用net.tcp或内存管道从调度或工作流引擎调用它。通过这种方式,您可以从所有IIS糖衣中获益。并且不需要封送线程和错误处理 第二,实现某种类型的事件总线来解耦信号器和域逻辑 我编写了这个小库,它在域事件和信号器之间进行代理 使用nuget安装
Install-Package SignalR.EventAggregatorProxy
请查看wiki,了解连接它所需的几个简单步骤
要获得超轻量级进程内事件总线,请查看Caliburn.Micros EventAggregator
您认为在MVC应用程序的任何部分使用此代码如何
IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<CanvasHub>();
hub.Clients.All.redraw(redrawData);
IHubContext hub=GlobalHost.ConnectionManager.GetHubContext();
hub.Clients.All.redraw(重绘数据);
在你继续这一方向之前,我建议你阅读这篇博文:希望在阅读之后,你不再想在你的web应用程序中实现任何后台任务。实际上,我在写这段代码之前就已经阅读了这篇博文。这就是我决定使用WebBackgrounder的原因。我希望你不要在你的web应用程序中使用它。MVC应用程序与WCF双工服务相结合如何?只要你有后台操作,你将MVC应用程序与什么结合并不重要。正确的方法是在一个单独的进程中移动这些操作(可能是一个Windows服务)。在MVC应用程序的任何部分中使用这些代码会怎么样<代码>IHubContext hub=GlobalHost.ConnectionManager.GetHubContext();hub.Clients.All.redraw(重绘数据)代码>我认为它不好,因为它将您与signar结合在一起,但同时它看起来非常面向用户界面(CanvasHub),所以在这种情况下可能没问题,但我认为分离类似这样的关注点是一个很好的实践