ASP.NET MVC 4后台操作

时间:2013-06-07 11:41:20

标签: asp.net-mvc-4 background signalr

我正在为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中的作业?

此外,我不喜欢这个工作事件系统,这对我来说有点尴尬。任何提案?

2 个答案:

答案 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);