Удаление зависимости из конструктора - PullRequest
1 голос
/ 06 января 2011

Я использую веб-формы, и мне интересно, как я могу удалить следующую конкретную ссылку на хранилище. В прошлом я использовал Castle Windsor с MVC, но я не думаю, что смогу использовать это здесь?

Код:

ICustomerRepository repos;

public Workout_Admin()
    // here is the offending concrete implementation
    : this(new SqlCustomerRepository()) { }

public Workout_Admin(ICustomerRepository repos)
{
    this.repos = repos;
}

ОБНОВЛЕНО ---

Я обновил статический метод как предложенный, а также добавил дополнительный код в фабрику виндзоров

WindsorContainer container;

public WindsorControllerFactory()
{
    container = new WindsorContainer(
        new XmlInterpreter(new ConfigResource("castle")));

    var controllerTypes =
        from t in Assembly.GetExecutingAssembly().GetTypes()
        where typeof(IController).IsAssignableFrom(t)
        select t;

    foreach (Type t in controllerTypes)
    {
        container.AddComponentLifeStyle(t.FullName, t,
            LifestyleType.Transient);
    }

    CommonServiceLocatorPageHandlerFactory.Container = container;
}

Проблема, которая продолжает возникать, связана с загрузкой сборки из файла конфигурации. CommonServiceLocatorPageHandlerFactory находится в сборке, которая называется yourfit, папка называется factory. А вот и соответствующие конфиги

<httpHandlers>
  <add verb="*" path="*.aspx"
    type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/>
</httpHandlers>
<handlers>
  <remove name="UrlRoutingHandler"/>        
    <add name="CSLPageHandler" verb="*" path="*.aspx"
      type="YourFit.Factory.CommonServiceLocatorPageHandlerFactory, YourFit"/>
</handlers>

и ошибка:

Не удалось загрузить тип 'YourFit.Factory.CommonServiceLocatorPageHandlerFactory' из сборки 'YourFit'.

Я знаю, что, скорее всего, я действительно глупый. Большое спасибо за ваше время.

1 Ответ

1 голос
/ 06 января 2011

Вы можете сделать это. Однако для механизма компиляции ASP.NET необходим конструктор по умолчанию, но вы можете сделать его защищенным. Вы можете внедрить зависимости в другом конструкторе, определив пользовательский PageHandlerFactory, который внедряет зависимости в перегруженном (открытом) конструкторе. Ваш класс будет выглядеть так:

public class Workout_Admin : Page
{
    ICustomerRepository repos;

    protected Workout_Admin() { }

    public Workout_Admin(ICustomerRepository repos)
    {
        this.repos = repos;
    }
}

Вот статья , в которой показано, как это сделать (для Castle Windsor просто измените код в методе GetInstance для вызова контейнера Windsor). Обратите внимание, что для этого вам нужно работать с полным доверием.

UPDATE

Вы можете изменить метод private static object GetInstance(Type type), описанный в статье, следующим образом:

public static IWindsorContainer Container;

private static object GetInstance(Type type)
{
    return Container.Resolve(type);
}

В пути запуска вашего приложения (где вы настраиваете контейнер Castle Windsor) вы должны установить статическое свойство Container:

// Create
IWindsorContainer container = ...

// Configure

// Set container to page handler factory
CommonServiceLocatorPageHandlerFactory.Container = container;

Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...