Я учусь TDD. Я знаю о внедрении зависимостей, когда вы помещаете зависимости класса в параметры конструктора и передаете их, передавая реализации по умолчанию из конструктора по умолчанию, например;
public AccountController() : this( RepositoryFactory.Users())
{
}
public AccountController( IUserRepository oUserRepository)
{
m_oUserRepository = oUserRepository;
}
RepositoryFactory - простой статический класс, который возвращает выбранные реализации для текущей сборки
Но проект веб-приложения ASP.NET MVC по умолчанию этого не делает, вместо этого DI принимает форму открытых свойств, которые назначаются в инициализаторе объекта в тестовом классе, например; from AccountController.cs:
protected override void Initialize(RequestContext requestContext)
{
if (FormsService == null)
{ FormsService = new FormsAuthenticationService(); }
if (MembershipService == null)
{ MembershipService = new AccountMembershipService(); }
base.Initialize(requestContext);
}
А в тестовом классе AccountControllerTest.cs:
private static AccountController GetAccountController()
{
AccountController controller = new AccountController()
{
FormsService = new MockFormsAuthenticationService(),
MembershipService = new MockMembershipService(),
Url = new UrlHelper(requestContext),
};
//snip
}
Итак, теперь мой класс AccountController имеет два подхода к внедрению зависимостей. Какой из них я должен использовать? Конструктор инъекций или общедоступные свойства?
Думаю, конструктор инъекций ...
Является ли использование ASP.NET MVC общедоступных свойств подобным образом, потому что вам нужно предоставить конкретный способ внедрения в конструктор, а базовое веб-приложение «Создать новое» должно быть общим в качестве отправной точки?