使用StructureMap处理Timer_Elapsed中的Datacontext操作

时间:2012-06-15 07:27:32

标签: c# asp.net-mvc-3 structuremap datacontext

请问在timer_elapsed事件中连接/使用datacontext对象的最佳方法是什么。我在timer_elapsed中有一个datacontext对象,它在第一次运行时完美运行但在后续调用timer_elapsed事件时什么也没做。我知道在线程池线程上为每次调用已经过时的事件创建了一个新实例。如何控制此行为或至少让我的代码始终如一地运行。谢谢。

这是我的结构图配置

ForRequestedType<BulkSMSDataContext>()
            .TheDefaultIs(() => new BulkSMSDataContext())
            .CacheBy(InstanceScope.Hybrid);

这是我的计时器实现

void _timerSendScheduledMessages_Elapsed(object sender, ElapsedEventArgs e)
    {
        DateTime currentUTC = DateTime.UtcNow.AddSeconds(-DateTime.UtcNow.Second).AddMilliseconds(-DateTime.UtcNow.Millisecond);

        var msgToSend = from c in _messageRepository.GetMessages(MessageTypes.Scheduled)
                        where c.Time == currentUTC
                        select c;


        foreach (var msg in msgToSend)
        {
            int scheduledMsgID = msg.MessageID;
            Response res = _messageService.Send(msg);
            _messageRepository.DeleteScheduledMessage(scheduledMsgID);
        }
    }

1 个答案:

答案 0 :(得分:0)

为了更好地控制范围,我会在每次调用时更改已用事件以创建新的_messageRepository,假设您将datacontext传递给_messageRepository。然后让structmap将datacontext注入其中。

否则你最终会得到一个定义不明确的工作单元,这往往会带来像你所拥有的那样的范围问题。

虽然没有看到你的实现,很难说清楚。