2012-05-29 4 views
3

Мы используем весну для нашего контейнера IOC в проекте MVC3. Я пытаюсь создать базовый контроллер, который будет иметь зависимость конструктора от нашего интерфейса IUserIdentity. Я хотел бы определить зависимость конструктора один раз в файле контекста приложения для абстрактного класса и надеялся, что весна сможет ввести это для каждого производного класса.Может Spring.Net вводить абстрактный конструктор классов arg для всех производных классов

public abstract class ControllerBase : Controller 
{ 
    private readonly IUserIdentity _userContext; 

    public ControllerBase(IUserIdentity userContext) 
    { 
     _userContext = userContext; 
    } 
} 

public class ChildController : ControllerBase 
{ 
    private readonly IChildDependency _childService; 
    public ChildController(IUserIdentity userContext, IChildDependency childService) 
    : base(userContext) 
    { 
     _childService= childService; 
    } 
} 

Я надеялся, что есть способ определить нечто вроде следующего - (не знаю, как это будет работать) без повторного определения UserIdentity для каждого производного класса.

<object id="ControllerBase" abstract="true" singleton="false" > 
    <constructor-arg index="0"> 
     <ref object="DefaultUserIdentity"/> 
    </constructor-arg> 
</object> 
<object id="ChildController" singleton="false" > 
    <constructor-arg index="1" > 
     <ref object="ConcreteChildDependency" /> 
    </constructor-arg> 
</object> 

Как и следовало ожидать, когда я делаю что-то вроде этого, весна не знает, что надеть в первый аргумент в производной (ChildController) класса.

ответ

3

Try со ссылкой на ControllerBase определение объекта с помощью атрибута parent:

<object id="ControllerBase" abstract="true" singleton="false" > 
    <constructor-arg index="0"> 
     <ref object="DefaultUserIdentity"/> 
    </constructor-arg> 
</object> 
<object id="ChildController" singleton="false" parent="ControllerBase" > 
    <constructor-arg index="1" > 
     <ref object="ConcreteChildDependency" /> 
    </constructor-arg> 
</object> 

Это позволит ChildController "наследовать" определение объекта от ControllerBase. См. Документы spring.net для получения дополнительной информации о object definition inheritance. Возможно, вы захотите отбросить атрибуты индекса из конструктора args, btw. Они не нужны, если типы аргументов конструктора могут быть разрешены неявно. И ваше ChildController нуждается в определении типа, конечно.

+0

Thank! Это сработало отлично. Кроме того, мне нравится отбрасывать индексный tidbit. –

+1

Приятно слышать; при использовании инсталляции конструктора, как вы здесь делаете, также может быть полезно проверить [autowiring] (http://www.springframework.net/doc-latest/reference/html/objects.html#objects-factory-autowire). В случае инъекции конструктора я обнаружил, что автоустановка работает достаточно хорошо. – Marijn

+0

Autowire отлично работает. Думаю, у меня было это в голове, что autwire был широко распространенным приложением (некоторые из наших интерфейсов имеют несколько типов, поэтому должны быть указаны аргументы конструктора). –

Смежные вопросы