ASP.NET MVC Global.asax Инъекция с помощью Spring

Я пытаюсь добавить свойство в мое SpringMvcApplication (из Spring.Web.Mvc).

public class MvcApplication : SpringMvcApplication
{
    public ISomeService SomeService { get; set; }

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        // Use SomeService
    }
}

Тогда у меня есть файл Services.xml, который содержит мои определения

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
  <object name="HttpApplicationConfigurer" type="Spring.Context.Support.HttpApplicationConfigurer, Spring.Web">
    <property name="ApplicationTemplate">
      <object>
        <property name="SomeService" ref="ISomeService" />
      </object>
    </property>
  </object>
  <object id="ISomeService" type="WebProject.Services.SomeService, WebProject">
    <constructor-arg ref="UserService" />
  </object>
</objects>

Всякий раз, когда я пытаюсь использовать свойство SomeService, я получаю исключение нулевой ссылки. Моя конфигурация неверна? Нужна ли какая-либо дополнительная конфигурация?

Мой обходной путь на данный момент, который не кажется правильным, это

protected override void ConfigureApplicationContext()
{
    base.ConfigureApplicationContext();

    SomeService = (ISomeService)ContextRegistry.GetContext().GetObject("ISomeService");
}

1 ответ

Решение

MvcApplication расширяет класс SpringMvcApplication, который фактически устанавливает контекст Spring.net, поэтому мне кажется странным использовать di для настройки его свойств.

Метод, который вы переопределяете сейчас, предназначен для того, чтобы вы могли в последнюю секунду внести изменения в контекст приложения Spring.net, непосредственно перед его передачей в инфраструктуру asp.net mvc.

В вашем случае, несколько лучшим решением было бы иметь SomeService доступ к контексту непосредственно в его получателе. Таким образом, у вас было бы преимущество областей управляемых объектов Spring, которых у вас сейчас нет.

Другие вопросы по тегам