Упрощение услуг в .net core web api - mediatr - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я работаю над проектом, написанным на .net core 2.1, и сервисы быстро растут.Многие зависимости вводятся через DI, и конструктор начинает выглядеть как ад

Пример:

public ContractService(IContractRepository contractRepository, IAssetModelRepository assetModelRepository,
    IAssetInstanceRepository assetInstanceRepository, IConsentRepository consentRepository,
    IPaymentScheduleRepository paymentScheduleRepository, IStagedContractRequestRepository stagedContractRequestRepository,
    IProductVersionRepository productVersionRepository, IContractQuery contractQuery, IProductQuery productQuery, IBpmOnline bpmOnline, IStorage storage, ICountryRepository addressRepository, IALFConfiguration alfConfiguration, IContractDocumentQuery contractDocumentQuery, User user, IALFConfiguration configuration, IEmailService emailService, IFileHelper fileHelper, IOptions<EmailConfiguration> emailConfiguration)
{
    this.addressRepository = addressRepository;
    this.assetInstanceRepository = assetInstanceRepository;
    this.assetModelRepository = assetModelRepository;
    this.contractRepository = contractRepository;
    this.consentRepository = consentRepository;
    this.paymentScheduleRepository = paymentScheduleRepository;
    this.stagedContractRequestRepository = stagedContractRequestRepository;
    this.productVersionRepository = productVersionRepository;
    this.contractQuery = contractQuery;
    this.productQuery = productQuery;
    this.bpmOnline = bpmOnline;
    this.storage = storage;
    this.user = user;
    this.alfConfiguration = alfConfiguration;
    this.contractDocumentQuery = contractDocumentQuery;
    this.configuration = configuration;
    this.emailService = emailService;
    this.fileHelper = fileHelper;
    this.emailConfiguration = emailConfiguration;
}

Является ли хорошей идеей использовать MediatR внутри сервисов?Насколько я знаю (я проверил много примеров того, как его использовать), его следует использовать внутри контроллеров.Мне интересно, как я могу использовать его в своем проекте (чтобы сделать меньшие классы с меньшими зависимостями).Если это возможно, просто помогите мне с этим единственным случаем.Я внедряю здесь emailService и использую его внутри некоторых методов.

Пример

private void SendEmailAboutProcessingData(CreateContractCommand registerContractCommand)
{
    BackgroundJob.Enqueue(() => emailService.Send(new EmailDto
    {
        EmailAddress = registerContractCommand.ContractingParties.FirstOrDefault().EmailAddress,
        Body = fileHelper.GetStringFromFile(ApplicationConstants.AssetFolderName, ApplicationConstants.ProcessingDataEmailFileName),
        Title = emailConfiguration.Value.ProcessingDataInformationEmailTitle
    }));
}

Как вы можете видеть, он использует fileHelper и emailConfiguration (так что только эта логика добавляет 2 дополнительные зависимости).Это хорошая идея, чтобы поместить эту логику в качестве обработчика команды или запроса?А внутри моего сервиса просто напишите

await mediator.Send(new EmailAboutProcessingData());

Возможно, это не очень хорошая идея, но я не совсем понимаю, как использовать Mediatr в реальном мире (а не просто в примерах) и в случаях, когда один метод API содержитмного бизнес-логики (соединение с некоторыми внешними сервисами, использование нескольких репозиториев и классов запросов, требует некоторых конфигураций из наборов приложений. Где вся логика внутри моего сервиса должна выполняться внутри TransactionScope, чтобы гарантировать, что мы можем выполнить откат, если что-то пойдет не так.

...