代码之家  ›  专栏  ›  技术社区  ›  Phil.Wheeler

在MVC中记录事件-哪种方法最适合?

  •  1
  • Phil.Wheeler  · 技术社区  · 14 年前

    我有一个MVC2 web应用程序,需要记录用户的唯一登录次数。每次用户登录时,都需要将记录保存到数据库中。只是时间,日期之类的基本问题。

    考虑到业务需求是只在一个特定的ActionResult(即用户登录)中记录案例,我是否应该简单地编写一些自定义代码来将记录发送到数据库?

    或者,考虑到公司确实有后来改变主意的记录(这在客户中并不常见),我是否可以更好地创建一些更健壮的东西并使用它?

    最后,改用Log4Net怎么样?考虑到最初的需求只关注一个应用程序的一小部分,即使以后它可能更具可扩展性,这是否过分了?

    建议和热烈的辩论受到赞赏。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jeff Ogata    14 年前

    因为你用的是 SqlMembershipProvider ,最简单的方法可能是添加 update trigger aspnet_Membership 桌子。什么时候? LastLoginDate 更新后,触发器可以填充单独的跟踪表。如果要使用 FailedPasswordAttemptCount 列。

    有关用户登录时如何更新这些字段的详细信息,请参阅 SqlMembershipProvider.ValidateUser 方法:

    成功验证用户后,最后活动日期和最后登录日期值将更新为数据库中的当前日期和时间。

    如果向ValidateUser方法提供了不正确的密码,则跟踪无效密码尝试的内部计数器将递增一。

    关于一般的日志记录,不管怎样,您都可能希望使用日志记录框架,我建议您 NLog .

        2
  •  1
  •   quentin-starin    14 年前

    您描述的需求似乎非常适合应用程序/域事件。

    当用户登录时,应该引发应用程序范围的事件,以表示事件(用户登录)已发生。“event”是一条消息,我总是把它们写成没有行为的数据包(除了完全公共属性之外什么都没有),并且我通常让它们包含处理程序所需的所有上下文(数据)(通常只是一个记录ID)。

    另外,为在数据库中记录相关信息的事件编写一个处理程序。处理程序应该是一个单独负责的类。如果响应事件需要执行更多操作,请将它们作为单独的处理程序实现。

    然后,在应用程序启动的某个地方,必须连接处理程序以侦听应用程序/域事件。

    因此,将需要一些基础设施代码来支持这种模式,但它应该是简单而简短的代码,而DI/IoC容器通常可以极大地帮助这些代码。如果您使用google域事件,还可以使用许多实现示例。

    我发现这种应用程序/域事件模式 例外地 很强大。采用这种模式极大地改进了我的代码。我发现不用修改就可以更容易地扩展系统的行为 任何 在现有的代码中,这种行为通过在您的示例中有一个明确的位置来封装,该代码记录用户在其中的代码以及记录关于应用程序登录的统计信息的代码。

    最后,我不会使用Log4Net来实现这一点。如果您实现了这个事件,处理程序应该非常简单和直接,但是如果您试图通过shoe horn Log4Net来执行持久性,那么。。。看起来你至少会在某种程度上与你的工具(Log4Net)抗争——而这完全可以通过不使用它来避免。