【问题标题】:Which PreApplicationStartMethod should I use?我应该使用哪个 PreApplicationStartMethod?
【发布时间】:2012-01-24 12:55:22
【问题描述】:

我注意到,当我将 NuGet 中的 StructureMap 安装到我的 ASP.NET MVC3 项目中时,Dave Ebbo 的 WebActivator 包也被添加为依赖项。

WebActivator 提供了一个PreApplicationStartMethod 属性,并且在安装时添加的样板代码中,它用于在它自己的类中初始化IoC 容器和依赖解析器,而不是在Global.asaxApplication_Start 中执行此操作方法。

鉴于 ASP.NET 4 已经拥有自己的 System.Web.PreApplicationStartMethodAttribute,为什么 WebActivator 需要提供自己的版本,而 StructureMap 需要使用它?

我猜我没有使用 WebActivator 的变体?

为 Darin 添加了代码:

using System.Web;
using System.Web.Mvc;
using StructureMap;

[assembly: WebActivator.PreApplicationStartMethod(
                    typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")]
// or

[assembly: PreApplicationStartMethod(
                    typeof(MyMvcApp.App_Start.StructuremapMvc), "Start")]

namespace MyMvcApp.App_Start {
  public static class StructuremapMvc {
    public static void Start() {
      var container = (IContainer) IoC.Initialize();
      DependencyResolver.SetResolver(new SmDependencyResolver(container));
    }
  }
}

【问题讨论】:

    标签: asp.net asp.net-mvc structuremap


    【解决方案1】:

    在 ASP.NET MVC 3 中用于 DI 容器的 NuGet 包通常更喜欢使用 WebActivator 以避免与您在 Application_Start 中可能拥有的任何现有代码混淆。 Ninject 使用完全相同的方法。

    您的应用程序中可以有多个 WebActivator.PreApplicationStartMethod 属性,在 .NET 4.5 之前可以有一个 System.Web.PreApplicationStartMethodAttribute

    【讨论】:

    • @Kev,这是因为每个应用程序可以有一个 System.Web.PreApplicationStartMethodAttribute,如果 StructureMap 使用了它,您将无法再提供自己的自定义初始化。 WebActivator.PreApplicationStartMethod 比内置的 ASP.NET 4.0 属性更复杂。它依赖于它,但它使用反射来获取所有正在注册的WebActivator.PreApplicationStartMethod 并执行所有这些。这就是 NuGet 包使用这种方法的原因。为了避免劫持你的内置方法。
    • 每个应用程序只能有一个 System.Web.PreApplicationStartMethodAttribute 是不正确的...每个程序集只有一个
    • @JeffPutz 你确定这是真的吗?我刚刚对其进行了测试,在同一个程序集中有多个似乎没有问题。
    • 这绝对是真的。而且我相信从 .Net 4.5 开始,它甚至不再局限于每个程序集一个。
    • 在 4.5 中,您可以在同一个程序集中拥有多个 PreApplicationStartMethodAttribute。 stackoverflow.com/questions/11800954/…
    猜你喜欢
    • 2016-09-28
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-08-17
    • 2011-02-22
    相关资源
    最近更新 更多