Вы можете составлять классы для отдельных сервисов так же, как если бы вы не использовали Hangfire.Если два сервиса делают разные вещи, то они, вероятно, должны быть отдельными классами.
Вы можете зарегистрировать их как повторяющиеся задания в соответствии с их конкретными типами:
RecurringJob.AddOrUpdate<SomeService>(
system,
s => s.DoWhateverThisServiceDoes(),
appSettings.AuthInterval,
TimeZoneInfo.Local);
RecurringJob.AddOrUpdate<OtherService>(
system,
o => o.DoOtherThing(),
appSettings.AuthInterval,
TimeZoneInfo.Local);
Что делать, если вы решите, что эти две службы не должны запускаться как отдельные задачи, а скорее какчасть одной задачи?Вы также можете сделать это:
public class CompositeService
{
private readonly SomeService _someService;
private readonly OtherService _otherService;
public CompositeService(SomeService someService, OtherService otherService)
{
_someService = someService;
_otherService = otherService;
}
public async Task DoCompositeThing()
{
await Task.WhenAll(
_someService.DoWhateverThisServiceDoes(),
_otherService.DoOtherThing());
}
}
RecurringJob.AddOrUpdate<CompositeService>(
system,
s => s.DoCompositeThing(),
appSettings.AuthInterval,
TimeZoneInfo.Local);
Ключевым моментом является то, что если вы решите зарегистрировать их отдельно или создать одну задачу, которая выполняет обе, вам не нужно менять способ написания индивидуумаклассы.Чтобы решить, делать ли их одним классом или отдельными классами, вы можете применить принцип единой ответственности, а также рассмотреть, что облегчит их понимание и модульное тестирование.Лично я склоняюсь к написанию меньших, отдельных классов.
Еще один фактор заключается в том, что отдельные классы могут иметь свои собственные зависимости, например:
public class SomeService
{
private readonly IDependOnThis _dependency;
public SomeService(IDependOnThis dependency)
{
_dependency = dependency;
}
public async Task DoWhateverThisServiceDoes()
{
// uses _dependency for something
}
}
Это будет более управляемым, если вы продолжитезанятия раздельные.Если они все в одном классе, и разные методы зависят от разных вещей, вы можете получить множество несвязанных зависимостей и метод, объединенный в одном классе.Там нет необходимости делать это.Даже если мы хотим, чтобы все функциональные возможности "оркестрировались" одним классом, мы все равно можем написать его как отдельные классы, а затем использовать другой класс для их объединения.
Это одна из замечательных особенностей паттерна зависимостиинъекции.Это ограничивает объем кода, который мы должны прочитать и понять за один раз.Один класс может иметь зависимость или несколько зависимостей.Когда вы смотрите на этот класс, вам не нужно думать о том, имеют ли эти зависимости свои собственные зависимости.Может быть уровень на уровне вложенных зависимостей.Но когда мы смотрим на один класс, мы должны думать только о том, что он делает и как использует свои зависимости.(Именно поэтому это облегчает модульное тестирование.)
Сколько бы классов вы ни создавали, вам нужно зарегистрировать их все в IServiceCollection
вместе с их зависимостями.Вы упомянули, что не хотите регистрировать несколько служб, но это нормально.Если оно становится большим и выходит из-под контроля, есть способы его разбить.