在MVC/IIS(DDD)中安排事件



我的域包含一个事件系统,如果到达某个日期/时间,该系统将发送电子邮件,因此我必须不断检查已注册事件的"调用日期";据我所知,这是应用程序服务的一个关注点。

然而,该应用程序将作为IIS上的MVC应用程序托管,IIS不支持有状态组件(除了"会话"(,所以我想知道对于这种情况,什么是合适的解决方案。

使用Revalee开源项目可以在ASP.NET MVC项目中调度任务。

Revalee是一项允许您安排对web应用程序的web回调的服务(。在你的情况下,你会安排一个回拨,在特定的时间发送电子邮件。Revalee可以很好地处理离散事务操作的任务,比如发送自动电子邮件或更新数据库值(读作:运行时间不长(。执行操作的代码都将驻留在MVC应用程序中。

让我们假设下面的例子,你需要在新用户在你的网站上注册27天后向他们发送一封电子邮件(类似于"你的试用计划即将到期"(。

要使用Revalee,您需要:

  1. 在您的服务器上安装Revalee服务,一种Windows服务。Windows服务有源代码(您可以自己编译(或Revalee网站上的预编译版本。

  2. 在您的Visual Studio项目中使用MVC特定的Revalee客户端库。(还有一个非MVC版本。(客户端库在源代码中可用(同样,您可以自己编译(,也可以通过NuGet获得预编译版本。

  3. 当你的新网站用户注册ScheduleExpirationMessage()方法时,你会注册一个未来的回调(这个例子假设你需要在27天后执行操作(。

    private void ScheduleExpirationMessage(int userId)
    {
        DateTimeOffset callbackTime = DateTimeOffset.Now.AddDays(27.0);
        // The callback should be in 27 days from now
        Uri callbackUrl = new Uri(string.Format("http://mywebapp.com/ScheduledCallback/SendExpirationMessage/{0}", userId));
        // Register the callback request with the Revalee service
        RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
    }
    
  4. 当Revalee回叫你的应用程序时,你的应用会执行你编码它要做的任何操作。在ScheduledCallback控制器中,你的SendExpirationMessage操作(见上面的Uri(可能看起来像:

    [AllowAnonymous]
    [CallbackAction]
    public ActionResult SendExpirationMessage(int userId)
    {
        // TODO Lookup the user's information and send the trial expiration message
        // ...
        return new EmptyResult();
    }
    

我希望这能有所帮助。

注意:上面的代码示例使用ScheduleCallback()的同步版本,Revalee客户端库也支持异步调用àla:

RevaleeRegistrar.ScheduleCallbackAsync(callbackTime, callbackUrl);

免责声明:我是Revalee项目的开发人员之一。然而,需要明确的是,Revalee是免费的开源软件。源代码可在GitHub上获得

最新更新