Авторизация и Виндзор

Профилирование Вашего приложения с чем-то как Xdebug (как рекомендуемый tj9991) определенно будет необходимостью. Это не имеет много смысла просто обойти вещи оптимизации вслепую. Xdebug поможет Вам найти реальные узкие места в своем коде, таким образом, можно будет провести время оптимизации мудро и зафиксировать блоки кода, которые на самом деле вызывают медленные холмы.

при использовании Apache другая утилита, которая может помочь в тестировании, Осада . Это поможет Вам ожидать, как Ваш сервер и приложение будут реагировать на высокие загрузки путем реального проверения его в деле.

Любой вид кэша кода операции для PHP (как APC или один из многих других) поможет много также.

5
задан Mark Seemann 6 November 2009 в 18:21
поделиться

3 ответа

Вы не можете использовать DI с атрибутами - это метаданные;

public class MyCustomAuth : AuthorizeAttribute
{
    public void OnAuthorization(...)
    {
         IUserService userService = ServiceLocator.Current.GetInstance<IUserService>();
    }
}

Узнайте о Windsor / ServiceLocator здесь .

См. Аналогичный вопрос здесь ].

8
ответ дан 13 December 2019 в 05:37
поделиться

Вы можете использовать собственный ControllerActionInvoker и вводить зависимости свойств (вы не можете сделать внедрение конструктора, потому что фреймворк обрабатывает создание атрибутов). Вы можете увидеть сообщение в блоге , которое я только что написал об этой технике.

3
ответ дан 13 December 2019 в 05:37
поделиться

Вы не предоставили код замка или примеры конфигурации. Поэтому я предполагаю, что вы новичок в замке и не похожи на процесс регистрации.

Прежде всего, любой объект, над которым вы хотите действовать, должен поступать из Замка Виндзор через зарегистрированный тип. С учетом сказанного, вы идете по неправильному пути, пытаясь использовать Castle Windsor с атрибутами, потому что атрибуты не упоминаются в коде, а вместо этого отражаются. Следовательно, IoC (в данном случае Castle Windsor) нет места для создания объекта.

Я говорю это, потому что то, что вы пытаетесь выполнить, уже было сделано другими способами. Прежде всего, поместите вашу инъекцию зависимостей на свои контроллеры.

public class PostController
{
  private IUserService _userService;
  public PostController (IUserService userService)
  {
    _userService = userService;
  }

  // other logic

}

Чтобы Castle работал, вы должны зарегистрировать все типы. Итак, вам нужно зарегистрировать IUserService и какие службы реализуют этот интерфейс, в замке Виндзор. Вы можете сделать это вручную в вашем global.asax с помощью container.AddComponentWithLifeStyle; или более предпочтительный метод - использовать файл конфигурации.

Используя файл конфигурации, ваш IUserService будет выглядеть примерно так:

<?xml version="1.0" encoding="utf-8" ?>
<castle>
    <components>
        <!--lifestyle="singleton|thread|transient|pooled|webrequest|custom"-->

        <component
            id="UserService"
            service="MyMvcProject.IUserService, MyMvcProject"
            type="MyMvcProject.UserService, MyMvcProject"
            lifestyle="transient">
        </component>
    </components>
</castle>

MyMvcProject - это имя вашего проекта; убедитесь, что вы используете точное пространство имен и полное имя интерфейса, а также введите его. Пожалуйста, дайте образцы кода ваших реальных пространств имен, иначе мы больше не сможем вам помочь.

Прежде чем это сработает, вам нужно будет изменить свой app.config или web.config, чтобы зарегистрировать searchGroup для Castle Windsor:

<configSections>

    <section name="castle" 
        type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"/>

</configSections>

<castle configSource="castle.config"/>

Теперь что вы все зарегистрированы и настроены, пора сообщить вашему приложению MVC: «Используйте Castle Windsor для создания каждого экземпляра моих контроллеров». Это означает, что Виндзорский замок, будучи контейнером Inversion-of-Control (он же IoC), проверит зависимости вашего контроллера и увидит, что он зависит от IUserService, и реализует экземпляр UserService . Castle изучит свою конфигурацию зарегистрированных типов и увидит, что вы зарегистрировали службу для IUserService. И он увидит в вашем файле конфигурации, что вы хотите реализовать конкретный класс UserService, который реализует IUserService. Таким образом, контейнер IoC вернет UserService, когда будет запрошена зависимость от IUserService.

Но прежде, чем это произойдет, вы должны указать своему приложению MVC использовать сконфигурированный контейнер IoC. Вы делаете это, регистрируя новый ControllerFactory. Для этого посмотрите мой ответ на этот вопрос:

Почему Castle Windsor пытается разрешить мои «Контент» и «Скрипты» папку в качестве контроллера?

И обратите внимание на часть global.asax о том, как зарегистрировать этот код. Это работает довольно хорошо!

Теперь, когда все это сказано и сделано, вы хотите авторизовать пользователя. Используйте обычный [Authorize], который реализует проверку подлинности с помощью форм, и используйте службу _userService, чтобы получить любые данные пользователя, вошедшего в систему.

1
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: