Всегда ли производный класс должен вызывать базовый конструктор по умолчанию? - PullRequest
0 голосов
/ 25 декабря 2011

У меня есть следующее:

    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 для вызова конструктора с одним параметром?

Ответы [ 3 ]

4 голосов
/ 25 декабря 2011

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

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

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

0 голосов
/ 16 сентября 2016

вы можете даже иметь конструктор без параметров и использовать метод Injection для параметров

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;
    }
}
0 голосов
/ 25 декабря 2011

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

var prodCont = new ProductsController(accountService, productsService);

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

Что вам нужно сделать, это указать конструктору 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.

...