@Alexveto

Как правильно настроить Dependency Injection в ASP.NET MVC?

Исходные данные:
0) ASP.NET MVC 5
1) Есть контроллер Home, в который внедряется зависимость с помощью Ninject
public class HomeController : Controller
{
   private IPersonaDataProvider PersonaDataProvider { get; }

   public HomeController(IPersonaDataProvider personaDataProvider)
   {
      PersonaDataProvider = personaDataProvider;
   }
}

2) PersonaDataProvider
public class PersonaDataProvider : IPersonaDataProvider
{
   private IAccountsService AccountsService { get; }

   public PersonaDataProvider(IAccountsService accountsService)
   {
      AccountsService = accountsService;
   }
}

3) Ну и AccountsService:
public class AccountsService : IAccountsService
{
   private IPersonaDataProvider PersonaDataProvider { get; }

   public AccountsService(IPersonaDataProvider personaDataProvider)
   {
      PersonaDataProvider = personaDataProvider;
   }

Выдает ошибку: System.MissingMethodException: Для данного объекта не определено беспараметрических конструкторов.

Насколько я понимаю при создании объекта HomeController он пытается создать объект IPersonaDataProvider, но для его создания ему нужен объект IAccountsService, а для создания объекта IAccountService нужен объект IPersonaDataProvider, получается замкнутый круг.

Как разрешить такую ситуацию?
  • Вопрос задан
  • 417 просмотров
Решения вопроса 1
Нужно разомкнуть зависимости.

Когда Dependency Injection либа пытается ресолвнуть "самую глубокую" зависимость, в вашем случае это IAccountsService, то она не может этого сделать, т.к. встречает цикл.

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

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

По этой теме есть хорошая книга - Симан Марк "Внедрение зависимостей в .NET".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы