IoC (Замок Виндзор) и Статические Помощники - PullRequest
2 голосов
/ 08 июня 2009

Как настроить Castle Windsor на использование метода Initialize для статического вспомогательного класса при запросе объекта? Я пытаюсь добавить некоторые методы расширения HtmlHelper, поэтому это должен быть статический класс и метод. Мои расширения HtmlHelper зависят от IHtmlHelpersService, который уже настроен с помощью Castle Windsor. Я использую соглашение о конфигурации.

Редактировать Я думаю, что я хочу ComponentActivator или UsingFactory. Я пойду в тупик таким образом?

Ответы [ 4 ]

1 голос
/ 08 июня 2009

Я думаю, что вы имеете в виду Соглашение по конфигурации ?

Я не знаю, как сделать то, что вы предлагаете. Это немного странно, но вы всегда можете создать класс, который не является статичным, который соответствует интерфейсу и просто выполняет статические методы, которые вам нужны. Иногда подобные вещи являются неизбежным злом при использовании стороннего проекта. Конечно, если вы добавили патч для статической поддержки в проект Castle, они могут принять его

0 голосов
/ 10 мая 2011

Вы можете выполнить рефакторинг, взятый отсюда http://code.google.com/p/autofac/wiki/ExistingApplications:

Адаптируйте статический класс:

Иногда приложение группирует связанные функции в класс статических функций:

static class IdGenerator
{
  static int _next = 0;
  public static int GetNext()
  {
    return ++_next;
  }
}

Этот вид дизайна обычно не помещается в приложение, созданное с использованием внедрения зависимостей.

Вместо этого создайте интерфейс, обеспечивающий те же функции:

interface IIdGenerator
{
  int GetNext();
}

И реализующий класс адаптера, который использует статические методы:

class IdGeneratorAdapter : IdGenerator
{
  public int GetNext()
  {
    return IdGenerator.GetNext();
  }
}
0 голосов
/ 08 июня 2009

Другой вариант, это создать базовый класс для всех ваших ViewPages. Скройте существующее свойство HtmlHelper с вашей собственной версией:

public class MyHtmlHelper : HtmlHelper
{
  // Take helper service, implement special methods
}

public class MyViewPage : ViewPage
{
  protected new MyHtmlHelper HtmlHelper { get; set; }
  // Wire up HtmlHelper as appropriate -- which is not going to be easy since
  // the base property could be set at any time.
}

Теперь все ваши страницы просмотра будут использовать ваш специальный MyHtmlHelper со всем вашим специальным соусом, и они даже не должны быть методами расширения. Вариант состоит в том, чтобы ваш MyHtmlHelper предоставлял сервис и продолжал писать методы расширения, предназначенные для этого помощника.

0 голосов
/ 08 июня 2009

Я не думаю, что IoC может помочь вам со статическими классами, Windsor (или любой другой IoC в этом отношении) нужно что-то, что он может создать (вызвать конструктор).

Вы пытаетесь поменять вспомогательные методы в зависимости от конфигурации? Если это так, возможно, вы могли бы написать один набор методов расширения, которые вызывают IoC для своих реализаций.

...