Ответы - CodeHelperСписок последних 15 ответов на вопрос с сайта CodeHelperuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=17782012-09-25T20:48:44Zuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=1779Dependency Injection: когда следует использовать property injection?2009-11-26T07:36:45-06:002009-11-26T07:36:45-06:00safonoveaВ каких случаях имеет смысл использовать property injection вместо constructor injection? И стоит ли так вообще делать? Понятно, что жизненно важные зависимости нужно инжектить через конструктор. Ноuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=1780Ответ от admax на вопрос с сайта CodeHelper2009-11-26T07:50:27-06:002009-11-26T07:50:27-06:00admaxКонечно предпочтительнее использовать constructor injection. Но есть некоторые проблемы. Конструктор класса может вызываться в нескольких местах, а не только в IOC-контейнере. При этом по мере добавления в класс все новых и новых зависимостей придется менять все участки кода где вызываетсяuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=1781Ответ от admax на вопрос с сайта CodeHelper2009-11-26T08:36:41-06:002009-11-26T08:36:41-06:00admaxВот отрывок из справки по Spring.NET Команда Spring обычно оправдывает использование setter injection, потому что из-за большого числа аргументов конструктор может стать слишком громоздким, особенно когда некоторые параметры опциональны. Наличие setter-методов также дает возможность повторнойuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=1782Ответ от Чак Норрис на вопрос с сайта CodeHelper2009-11-26T09:42:12-06:002009-11-26T09:42:12-06:00Чак НоррисЕсть и такое радикальное мнение, что property injection можно использовать всегда. Большая куча свойств лучше большой кучи параметров конструктора. И с эстетической и с практической точки зрения. Единственное неудобство — при создании из IOC контейнера нет гарантии что клиент получает объект, уuuid:a8a58a1d-2ce9-4a23-9c96-18031996e384;id=1783Ответ от admax на вопрос с сайта CodeHelper2010-01-13T04:45:04-06:002010-01-13T04:45:04-06:00admaxЕсли у вас есть такой код (это из реального приложения): TestIssue = new Issue(Id, ProjectId, ProjectName, Code, Title, Description, CategoryId, CategoryName, PriorityId, PriorityName,PriorityImageUrl, StatusId, StatusName, StatusImageUrl, IssueTypeId, IssueTypeName,IssueTypeImageUrl, ResolutionId,