2013-08-19 4 views
1

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

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

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

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

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

+0

Чтобы ответить на вопрос, да, возможно, это возможно. – Dennisch

+0

ObjectBuilder? Шутки в сторону? Почему вы используете этот неясный мир технологий, который используется для создания контейнеров с DI? Почему бы вам просто не использовать Unity (который построен поверх ObjectBuilder)? – Steven

+0

Вам придется реализовать свой собственный HandlerFactory, но даже несмотря на то, что ASP.NET контролирует создание вашего обработчика, ему нужен конструктор по умолчанию. То, что вы можете попробовать, - это явная инъекция свойств (свойство зависимостей, помеченное атрибутом) и пользовательский HandlerFactory, который создает fsctory. Но не знаю, как это сделать с ObjectBuilder. – Steven

ответ

0

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

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). И он может выжить даже без документации interface/class.