使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作

Posted

技术标签:

【中文标题】使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作【英文标题】:Handling Datacontext Operations in Timer_Elapsed using StructureMap 【发布时间】:2012-06-18 06:26:43 【问题描述】:

请问在 timer_elapsed 事件中连接/使用 datacontext 对象的最佳方法是什么。我在 timer_elapsed 中有一个 datacontext 对象,它第一次运行完美,但在随后调用 timer_elapsed 事件时什么也不做。我知道每次调用线程池线程上的 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】:

为了更好地控制范围,我会在每次调用时更改 elapsed 事件以创建一个新的 _messageRepository,假设您将 datacontext 传递给 _messageRepository。然后让结构映射将您的数据上下文注入其中。

否则,您最终会得到一个定义不明确的工作单元,这往往会引发像您遇到的那样的范围界定问题。

虽然没有看到你的实现,但很难准确地说出来。

【讨论】:

以上是关于使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 PetaPoco 与 StructureMap 的共享连接

告诉 StructureMap 使用特定的构造函数

使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作

抽象类是不是像接口一样与 StructureMap 一起使用?

DI 依赖注入之StructureMap框架

Structuremap 是不是支持开箱即用的 Lazy?