Подход внедрения зависимостей для объекта, используемого только в одном методеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Подход внедрения зависимостей для объекта, используемого только в одном методе

Сообщение Anonymous »

Я переношу старое приложение 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
}
}
У меня есть класс, в котором есть множество методов, каждый из которых делает свое дело. Предположим, что класс нельзя разделить на разные более мелкие классы, возможно, это контроллер. Внутренний класс ожидает регистратор со своей собственной категорией. Теперь я мог бы создать его экземпляр в методе и передать существующий регистратор, но этот регистратор будет иметь неправильную категорию (

Код: Выделить всё

TestClass
вместо InnerClass). Я также мог бы внедрить IServiceProvider, однако, насколько я понимаю, это антишаблон, и его не следует делать при реализации DI. Я мог бы также ввести атрибут [FromService], однако это тоже антишаблон, плюс он работает только для действий контроллера, вызываемых из среды, а не для частных методов.
Другой подход мог бы заключаться в том, чтобы действительно отделить метод от другого объекта (см. это). Однако разве это не просто пинает банку в сторону? Если вам нужно будет затем внедрить этот объект для вызова метода, не происходит ли внедрение для всего TestClass?
Какой здесь лучший подход? Действительно ли ответ вводит его в курс дела всего класса? Что, если внутренний класс является помощником ORM, нужно ли мне каждый раз создавать соединение с БД?

Подробнее здесь: https://stackoverflow.com/questions/787 ... gle-method
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»