0

我正在为 ASP.NET MVC 4 后台操作寻找漂亮而优雅的架构解决方案。

我的目标是开发一个有自己的生活的世界,客户只能与之互动。现在让我们假设这将是一个简单的时钟,客户可以观看它。

现在我有 WebBackrounder + SignalR 包。

网络后台:

[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 中动态添加和删除作业?

我也不喜欢这个工作事件系统,对我来说有点尴尬。有什么建议吗?

4

2 回答 2

1

darin 说的是正确的,但可以解决。例如,我为这些场景所做的是拥有一个处理所有作业的内部 WCF 服务,您可以使用 net.tcp 或内存管道从调度或工作流引擎调用它。这样您就可以从所有 IIS 糖衣中受益。并且不需要编组你的线程和错误处理。

其次,实现某种事件总线来解耦 SignalR 和您的域逻辑。

我已经编写了这个在域事件和 SignalR 之间代理的小库 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy

使用 nuget 安装

Install-Package SignalR.EventAggregatorProxy 

请查看 wiki,了解连接它所需的几个简单步骤 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

对于一个超轻量级的进程事件总线,请查看 Caliburn.Micros EventAggregator http://nuget.org/packages/Caliburn.Micro.EventAggregator/

于 2013-06-10T11:24:06.610 回答
0

您如何看待在 MVC 应用程序的任何部分使用此代码?

IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<CanvasHub>();
hub.Clients.All.redraw(redrawData);
于 2013-06-10T16:40:59.053 回答