Внедрение зависимостей ObjectBuilder и веб-службы ASP.NET

Я использую Microsoft.Practices.ObjectBuilder в веб-проекте для обработки внедрения зависимостей (например, между представлением и докладчиком).

Недавно я добавил веб-службу ASP.NET (.asmx) для обработки вызовов ajax. Я также хотел бы использовать инъекцию зависимостей с ObjectBuilder, но я не могу заставить его работать.

Я попытался просто добавить что-то вроде этого:

[CreateNew]
public MyClass MyClass
{
    set
    {
        _myClass = value;
    }
}

Но это не работает. Установщик свойств MyClass никогда не вызывается. Возможно ли вообще заставить это работать?


person Joel    schedule 19.08.2013    source источник
comment
Чтобы ответить на вопрос, да, вероятно, возможно.   -  person Dennisch    schedule 19.08.2013
comment
ObjectBuilder? Шутки в сторону? Почему вы используете этот неясный мир технологий, который используется для создания контейнеров DI? Почему бы вам просто не использовать Unity (построенный поверх ObjectBuilder)?   -  person Steven    schedule 19.08.2013
comment
Вам нужно будет реализовать свой собственный HandlerFactory, но даже тогда ASP.NET контролирует создание вашего обработчика, поэтому ему нужен конструктор по умолчанию. Что вы можете попробовать, так это явное внедрение свойств (свойство зависимости, помеченное атрибутом) и настраиваемый HandlerFactory, который создает фабрику. Но не знаю, как это сделать с помощью ObjectBuilder.   -  person Steven    schedule 19.08.2013
comment
@ Стивен, у меня нет особого выбора. Старая устаревшая система, попытка избежать серьезного рефакторинга только для того, чтобы эта штука заработала. Я мог бы использовать Unity, но я стараюсь свести изменения к минимуму в этой части проекта.   -  person Joel    schedule 20.08.2013


Ответы (1)


Что касается старой устаревшей системы, особенно для тех, кто использует статические классы без сохранения состояния, я нашел этот дизайн наиболее подходящим:

public MyClass MyClass
{
    get
    {
        if(_myClass == null){ _myClass = new DefaultMyClass(); }
        return _myClass;
    }
    set
    {
        _myClass = value;
    }
}

При этом я все еще могу выполнять инъекцию зависимостей в модульном тесте, используя инъекцию установщика.

IMyClassUser m = new MyClassUser();
m.MyClass = new MockMyClass();

Хотя, по сути, не слишком меняет существующий код. А потом, когда придет время, его можно будет изменить с помощью конструктора DI.

Это также поможет вашему старому коллеге, который не слишком разбирается в DI, быстрее отслеживать код (используя Go to Definition). И он может выжить даже без _4 _ / _ 5_ документации.

person Fendy    schedule 20.08.2013