Я переношу старое приложение ASP.NET 4.7.2 MVC на ASP.NET Core и хочу узнать больше о подходе DI, поскольку он уже глубоко интегрирован в платформу Core. Однако до сих пор я столкнулся с некоторыми проблемами при его использовании. Я понимаю, что DI должен использоваться по всей цепочке вызовов, причем в каждый класс внедряются свои зависимости. Но что, если вы хотите использовать экземпляр класса только в определенном методе вашего текущего? Вы должны внедрить его для всего класса, тратя производительность на потенциально тяжелые экземпляры, когда в этом нет необходимости?
Вот пример;
Код: Выделить всё
public class TestClass(ILogger logger)
{
public void DoSomething()
{
// Do work here
}
public void DoAnotherThing()
{
// Do work here
}
private void CallSomethingFromInnerClass()
{
// Problematic code
new InnerClass().DoInnerClassWork();
}
}
public class InnerClass(ILogger logger)
{
public void DoInnerClassWork()
{
// Do work here
}
}
У меня есть класс, в котором есть множество методов, каждый из которых делает свое дело. Предположим, что класс нельзя разделить на разные более мелкие классы, возможно, это контроллер. Внутренний класс ожидает регистратор со своей собственной категорией. Теперь я мог бы создать его экземпляр в методе и передать существующий регистратор, но этот регистратор будет иметь неправильную категорию (
вместо InnerClass). Я также мог бы внедрить IServiceProvider, однако, насколько я понимаю, это антишаблон, и его не следует делать при реализации DI. Я мог бы также ввести атрибут [FromService], однако это тоже антишаблон, плюс он работает только для действий контроллера, вызываемых из среды, а не для частных методов.
Другой подход мог бы заключаться в том, чтобы действительно отделить метод от другого объекта (см. это). Однако разве это не просто пинает банку в сторону? Если вам нужно будет затем внедрить этот объект для вызова метода, не происходит ли внедрение для всего TestClass?
Какой здесь лучший подход? Действительно ли ответ вводит его в курс дела всего класса? Что, если внутренний класс является помощником ORM, нужно ли мне каждый раз создавать соединение с БД?
Подробнее здесь:
https://stackoverflow.com/questions/787 ... gle-method