11

Пример:Уместно ли использовать Инъекции свойств в базовом классе, когда зависимость требуется только в базовом классе?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

Мы все знаем, что мы должны использовать Constructor Injection когда зависимость является требуется. Если это факультативно зависимость, мы можем использовать Вклад в эксплуатацию.

Но что делать, если только ваш базовый класс требует зависимости?

Если вы использовали бы Конструктор Injection, вы бы, на мой взгляд, загрязнили все производные классы.

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

ли approperiate использовать Injection Property в базовом классе, когда зависимость требуется только в базовом классе?

ответ

12

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

Если базовый класс требует этой зависимости для правильной работы, поскольку производный класс получен из этого базового класса, он также неявно требует этой зависимости. Итак, второй пример - правильный путь. Вы не должны использовать инъекцию свойств для того, что является необходимой зависимостью.

+0

Я вижу вашу точку зрения, но проблема, которую я получу, - это много параметров конструктора. Дело в том, что производные классы не говорят напрямую с зависимостью, а не от базового класса. Поэтому я бы различал прямые вызовы зависимости и косвенные вызовы зависимости. – Rookian

+0

@Rookian, если вы попадаете в ситуацию, когда у вас есть несколько параметров конструктора, вы можете подумать о создании службы, которая будет агрегировать эти зависимости, а затем вставить только конструктор в конструктор. –

+5

+1 Наслаждайтесь композицией над наследованием. Если это проблема со слишком большим количеством параметров конструктора, обвините свою стратегию наследования, а не конструкторскую инъекцию. –

3

Фактически ваш производный класс IS является базовым классом. Другого объекта нет. Когда вы передаете что-то в базовый конструктор, вы фактически инициализируете тот же объект. И это показывает клиентам, что ваш экземпляр зависит от:

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

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