我正在为ASP.NET MVC 4后台操作寻找漂亮而优雅的架构解决方案。
我的目标是发展一些生活在自己生活中的世界,客户只能与之互动。现在让我们说它将是一个简单的时钟,客户可以看到它。
现在我有了WebBackrounder + SignalR包。
WebBackrounder:
[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;
}
}
RedrawJob,当它的执行上升事件和SignalR集线器捕获它时:
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中的作业?
此外,我不喜欢这个工作事件系统,这对我来说有点尴尬。任何提案?
答案 0 :(得分:1)
达林所说的是正确的,但它可以解决。例如,我为这些场景做的是拥有一个处理所有作业的内部WCF服务,您可以使用net.tcp或内存管道从调度程序或工作流引擎中调用它。这样您就可以从所有IIS糖衣中受益。并且不需要编组你的线程和错误处理。
其次,实现某种事件总线来解耦SignalR和你的域逻辑。
我已经编写了这个在域事件和SignalR之间代理的小lib https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy
使用nuget安装
Install-Package SignalR.EventAggregatorProxy
请查看维基,了解连接所需的几个简单步骤 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki
对于超轻量级的进程事件总线,请查看Caliburn.Micros EventAggregator http://nuget.org/packages/Caliburn.Micro.EventAggregator/
答案 1 :(得分:0)
您如何看待在MVC应用程序的任何部分使用此代码?
IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<CanvasHub>();
hub.Clients.All.redraw(redrawData);