Вызов супер-конструктора в C # - PullRequest
7 голосов
/ 24 декабря 2011

У меня есть классы, такие как AccountsController, ProductsController и т. Д., Которые все наследуются от BaseController. Unity настраивает мои услуги по мере необходимости. Этим классам также требуется служба _sequence. Поскольку это общее требование для всех классов, я хотел бы написать это в BaseController.

public class AccountsController : BaseController
{
    public AccountsController(
        IService<Account> accountService) {
        _account = accountService;
    }

public class ProductsController : BaseController
{
    public ProductsController(
        IService<Account> productService) {
        _product = productService;
    }


public class BaseController : Controller
{
    public IService<Account> _account;
    public IService<Product> _product;
    protected ISequenceService _sequence;

    public BaseController(
        ISequenceService sequenceService) {
        _sequence = sequenceService;
    }

Но как я могу это сделать? Должен ли я установить вызов BaseController внутри конструкторов каждого из AccountsController и ProductsController?

1 Ответ

12 голосов
/ 24 декабря 2011

Вы можете связать конструкторы :

public class ProductsController : BaseController
{
    public ProductsController(
        IService<Account> productService) : base(productService)
    {
        _product = productService;
    }
}

Обратите внимание, что цепочке BaseController (с использованием ключевого слова base) передан параметр productService, хотя это может быть что угодно.

Обновление:

Вы могли бы сделать следующее (внедрение зависимости бедного человека):

public class ProductsController : BaseController
{
    public ProductsController(
        IService<Account> productService) : base(new SequenceService())
    {
        _product = productService;
    }
}

Или передайте зависимость от ISequenceService через ваши наследуемые типы:

public class ProductsController : BaseController
{
    public ProductsController(
        IService<Account> productService, ISequenceService sequenceService) 
        : base(sequenceService)
    {
        _product = productService;
    }
}
...