2012-01-24 2 views
7

Я заметил, что когда я установил StructureMap из NuGet в свой проект ASP.NET MVC3, в качестве зависимости был добавлен пакет WebActivator Dave Ebbo.Какой метод PreApplicationStartMethod использовать?

WebActivator предоставляет атрибут PreApplicationStartMethod и, в шаблонный код добавляется во время установки, он используется для инициализации контейнера IoC и распознаватель зависимостей в его собственном классе, вместо того, чтобы делать это внутри Application_Start метода Global.asax «s.

Учитывая, что 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)); 
    } 
    } 
} 

ответ

5

NuGet пакеты для DI контейнеров в ASP.NET MVC 3, как правило, предпочитают использовать WebActivator, чтобы избежать баловаться с любым существующим кодом, который вы могли бы иметь в Application_Start. Ninject использует точно такой же подход.

Вы можете иметь несколько WebActivator.PreApplicationStartMethod атрибутов в вашем приложении и перед в .NET 4.5 один System.Web.PreApplicationStartMethodAttribute.

+0

Я полностью понимаю это, но мне любопытно, почему StructureMap предпочитает использовать 'WebActivator.PreApplicationStartMethodAttribute' над ASP.NET 4 при условии' System.Web.PreApplicationStartMethodAttribute'. – Kev

+1

@Kev, это потому, что вы можете иметь один «System.Web.PreApplicationStartMethodAttribute» для каждого приложения и если StructureMap его использовал, вы больше не сможете предоставлять свои собственные пользовательские инициализации. «WebActivator.PreApplicationStartMethod» более сложный, чем встроенный атрибут ASP.NET 4.0. Он полагается на него, но он использует отражение, чтобы получить все зарегистрированные «WebActivator.PreApplicationStartMethod» и выполнить их все. Вот почему пакеты NuGet используют этот подход. Чтобы избежать угона, вы используете встроенный метод. –

+0

Да, но простите меня, если я немного тускнел, StructureMap на самом деле не использует его *, как в случае резервирования, поэтому никакой другой код инициализации не может быть добавлен. См. Код, добавленный в мой вопрос. Я мог бы добавить другой код инициализации в 'Start()', который выполняет другую работу, отличную от структуры. – Kev

Смежные вопросы