C#. net ядро ​​условного построения объектов зависимости - PullRequest
0 голосов
/ 10 февраля 2020

Я создаю ASP. NET Приложение Core Rest API.

На контроллере, в зависимости от значения параметра, нам нужно создать запрос процессора { Работа процессора заключается в дальнейшая обработка запроса и выполнение бизнес-логики c}.

Теперь с. net core DI, как мы можем построить объект, когда у нас есть какое-то условие для выполнения на данных времени выполнения до идентификации системы какой тип объекта нам нужно создать / построить.

Я могу думать о ServiceLocator, но это анти-шаблон. Какой должен быть правильный подход к ее решению.

Пример кода:

Здесь у нас есть контроллер для расчета сборов, и этот расчет зависит от нескольких значений объекта запроса (Payment)

Теперь логика вычислений c отличается для значений Payment, но оба параметра и возвращаемые значения обеих служб (входящих / исходящих) одинаковы

public class FeeController : ControllerBase
{

    public PaymentController(IPayemntService is, IPayemntService os)
    {
        _inwordService = is;
        _outwordsService = os;

        // two dependency injected but on a request only need one 
    }

    public ActionResult<int> CalculateFees(Payment payment)
    {
        var retValue = 0;
        // this condition will be more complex...
        if (payment.Direction == PayDirection.Inwords)
        {
            //logic to calculate Fees and Tax for inwords operation
             retValue = _inwordService.calcualte(payment, "some other values may be");
        }
        else
        {
            //logic to calculate Fees and Tax for outwords operation
            retValue = _outwordsService.calcualte(payment, "some other values may be");

        }
        return retValue;
    }
}

Через. net core DI Мы можем создать оба экземпляра службы, но для отдельного запроса потребуется только один из них.

1 Ответ

0 голосов
/ 10 февраля 2020

Вы можете зарегистрировать несколько классов, которые реализуют ваш интерфейс, и вставить их как IEnumerable в конструктор.

public PaymentController(IEnumerable<IPaymentService> services) {}

После этого вы можете получить указанный c экземпляр, например, используя Linq. Добавьте пользовательское свойство в свой интерфейс, которое будет определять ваш тип.

Более чистый подход - это написание собственного распознавателя службы - фабрики.

Примеры уже здесь Как зарегистрировать несколько реализаций тот же интерфейс в Asp. Net Core?

Обратите внимание, что при написании условного выражения вместо service.calculate я бы предпочел удалить его и просто вызвать метод, сохраняя полиморфизм OOP в работе, но это зависит от вашего введенного экземпляра.

...