2011-12-25 4 views
0

У меня есть следующий:Имеет ли производный класс всегда вызов базового конструктора по умолчанию?

public class BaseController : Controller 
    { 
     protected ISequenceService _sequence; 

     public BaseController() 
     { 
     } 

     [InjectionConstructor] 
     public BaseController(ISequenceService sequence) 
     { 
      _sequence = sequence; 
     } 


public class ProductsController : BaseController 
    { 

     public ProductsController(
      IService<Account> accountService, 
      IService<Product> productService 
      ) { 
      _account = accountService; 
      _product = productService; 
     } 

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

Возможно ли иметь производный класс и без конструктора без параметров в родительском? Есть ли способ, которым я могу настроить Unity для вызова конструктора одного параметра?

+0

C++ имеет элемент Initializer Перечисляются для этого, я считаю, так же обстоит дело с C#. –

ответ

4

Вы must звонок a конструктор базового класса. Большую часть времени это означает вызов конструктора по умолчанию, и если вы его оставите, это будет сделано для вас неявно. Вы можете указать, какой конструктор вызвать, используя следующий синтаксис:

public ProductsController(IService<Account> accountService, 
          IService<Product> productService) 
    : base((ISequenceService)someISequenceService) // calls the one parameter constructor 
                // of the base class 
{ 
    //... 
} 

Попытки построить производный класс без инициализации базового класса первого просто не будет работать.

0

Это фактически не имеет ничего общего с Единством. Вы бы испытать такое же поведение, если вы просто сделали:

var prodCont = new ProductsController(accountService, productsService); 

Это называют ProductsController конструктор 2-параметр, и вызова на 0-параметр конструктора по умолчанию в BaseController.

Что вам нужно будет сделать, это сказать ProductsController конструктор в свою очередь, вызвать 1-параметрическое базовый застройщик вместо установленного по умолчанию, выполнив:

public ProductsController(IService<Account> accountService, IService<Product> productService) 
    : base(sequenceService) 

Но нет никакого ISequenceService передается к тому, что конструктор направить на базовый конструктор, так что вы, вероятно, на самом деле хотите:

public ProductsController(IService<Account> accountService, 
          IService<Product> productService, 
          ISequenceService sequenceService) 
    : base(sequenceService) 

Предполагая ISequenceService также отображается через Unity.

-1

вы даже можете иметь только параметр меньше, конструктор и использовать инъекционный метод для параметров

public abstract class Base : IBase 
>  { 
> 
>   private IDep dep; 
> 
>   [InjectionMethod] 
>   public void Initialize(IDep dep) 
>   { 
>    if (dep == null) throw new ArgumentNullException("dep"); 
>    this.dep = dep; 
> 
>    OnInitialize(); 
>   } 
> 
>   public dep DepProperty 
>   { 
>    get 
>    { 
>     return dep; 
>    } 
>   } 
>   protected abstract void OnInitialize(); 
>  } 

//now your Derived class Constructor will not be forced to have the IDep Parameter 
class Derived : Base 
{ 
    public Derived() 
    { 

    } 

    protected override void OnInitialize() 
    { 
     // you can access the baseclass dependency Instance in this override 
     object depObject = this.DepProperty; 
    } 
} 
Смежные вопросы