我应该使用哪个PreApplicationStartMethod方法?

9
我注意到当我从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));
    }
  }
}
1个回答

7

ASP.NET MVC 3中的DI容器NuGet包通常倾向于使用WebActivator,以避免干扰您可能在中拥有的任何现有代码。Ninject使用完全相同的方法。

您可以在应用程序中具有多个属性,并且在.NET 4.5之前只有一个。


1
@Kev,这是因为每个应用程序只能有一个System.Web.PreApplicationStartMethodAttribute,如果StructureMap使用它,您将无法提供自己的自定义初始化。WebActivator.PreApplicationStartMethod比内置的ASP.NET 4.0属性更为复杂。它依赖于它,但它使用反射来获取所有正在注册的WebActivator.PreApplicationStartMethod并执行它们中的所有方法。这就是为什么NuGet包使用此方法的原因。为了避免劫持内置方法。 - Darin Dimitrov
2
每个应用程序只能拥有一个System.Web.PreApplicationStartMethodAttribute这种说法是不正确的......实际上每个程序集只能有一个。 - Jeff Putz
1
@JeffPutz 你确定这是真的吗?我刚测试了一下,好像在同一个程序集中有多个没有问题。 - MartinF
2
这是绝对正确的。我相信从.Net 4.5开始,它甚至不再限制为每个程序集只能有一个。 - Jeff Putz
1
在4.5中,您可以在同一程序集中拥有多个PreApplicationStartMethodAttribute。https://dev59.com/b2bWa4cB1Zd3GeqPbeOE#11800997 - Eivind T
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接