0

我正在查看使用 SimpleMembership 的最新 ASP.NET MVC4 互联网应用程序。我看到以下内容放置在操作过滤器中:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

有人能告诉我为什么它是这样编码的吗?为什么不直接调用 global.asax 中的初始化代码,它会在每个应用程序启动时运行?我错过了什么吗?

4

2 回答 2

0

我不知道它为什么放在那里。但是,如果您希望您的Membership函数执行良好,那么您将需要调用该方法一次。因此,如果您Membership在除 in 之外的任何地方调用任何相关方法AccountController,请确保您首先调用了LazyInitializer.

我相信该模板使用了一个属性进行数据库初始化,因此如果初始化失败,该站点的未经过身份验证的部分仍然可以工作。

对于大多数实际目的,最好只在Application_Start.

于 2013-03-10T12:09:38.317 回答
0

将初始化放在 ActionFilter 中对于代码重用来说会更好一些。您可以将控制器放在自己的程序集中(假设您使用 DI 容器来查找控制器),然后在多个项目中重用它。由于初始化是在控制器的过滤器上完成的,因此您无需确保它已在每个项目中注册,因为它会自动被拾取。

另一个原因是延迟初始化 - 如果您的站点大部分是匿名的,那么您不需要调用这个初始化例程。当然,它可能不会做太多,但这意味着初始加载延迟仅发生在需要登录的页面上,而不是您的主页上。

于 2013-03-10T13:11:49.917 回答