Как внедрить зависимости в global.asax.cs - PullRequest
35 голосов
/ 13 октября 2011

Как мне вставить зависимости в global.asax.cs, то есть класс MvcApplication?

Ранее использовав шаблон Service Locator (anti-) для внедрения зависимостей, я пытаюсь следовать рекомендациям передового опыта в своем последнем приложении MVC, используя контейнер IOC (в частности, Unity.Mvc3, поскольку он поставляется с реализацией IDependencyResolver). из коробки) и конструктор впрыска.

Пока что все выглядит довольно просто, за исключением пары препятствий, одна из которых находится в global.asax.cs (другая - для пользовательских атрибутов, но уже есть вопрос о том, как это сделать).

Обработчики событий HttpApplication в классе MvcApplication, такие как:

Application_Start()
Application_EndRequest(object sender, EventArgs e)
Application_AcquireRequestState(object sender, EventArgs e)

может потребовать внешних зависимостей, например, зависимость от ILogService. Итак, как мне внедрить их, не прибегая к шаблону поиска служб (анти), например,

private static ILogService LogService
{
    get
    {
        return DependencyResolver.Current.GetService<ILogService>();
    }
}

Любая помощь / совет с благодарностью!

1 Ответ

37 голосов
/ 13 октября 2011

Класс в вашем global.asax.cs - это ваш Корень композиции , поэтому вы не можете (и не должны) вводить в него что-либо извне.

Однако есть только один экземпляр класса MvcApplication, поэтому, если вам нужен сервис в одном из его методов, вы можете просто объявить его как поле члена - например:

public class MvcApplication : System.Web.HttpApplication
{
    private readonly ILogService log;

    public MvcApplication()
    {
        this.log = new MyLogService();
    }

    protected void Application_Start()
    {
        // ...

        this.log.Log("Application started");
    }
}
...