У меня есть сервисная сборка с несколькими классами обслуживания. Каждый класс группирует набор связанных методов обслуживания. Эти службы создаются с использованием IoC и инжекторов конструктора.
Если у меня есть два класса обслуживания, которые иногда могут вызывать методы в другом, каков наилучший способ их обработки во избежание циклических ссылок?
Например, предположим, что два метода обслуживания из двух разных классов обслуживания (не обязательно самый практичный пример, но для простоты):
public class UserService
{
public void RegisterUser(User user)
{
// Do a bunch of stuff needed to register a user
// Now call out to permission service to set up basic permissions
_permissionService.SetUpBasicPermissions(user);
}
}
public class PermissionService
{
public void GrantPermission(User user, int PermissionId)
{
// Add user permission to database
// Now call out to user service to do some other stuff on the user
_userService.TakeActionsOnUserAccount(user);
}
}
Вот варианты, которые я вижу:
Учитывая, что функциональность должна быть разделена между двумя, это признак того, что классы обслуживания должны быть объединены в один класс. Если это так, могу ли я в конечном итоге получить один гигантский класс обслуживания? Что определяет, как они должны быть разделены?
Не объединяйте оба класса, а перемещайте методы, которые совместно используют логику, в свой собственный класс обслуживания (оставляя логику, специфичную для пользователя и разрешения, в их отдельных классах). Если это так, я могу получить несколько таких общих сервисов, и я думаю, что это не очень хорошая вещь.
Любые действия, необходимые из одного сервиса в другой, должны быть перенесены в вызывающий код. Это кажется проблематичным для меня, так как я бы убрал потенциально зависимую логику и сделал бы ее проблемой другого уровня. Другими словами, где бы я ни вызывал _userService.RegisterUser (), теперь мне всегда придется вызывать _permissionService.SetUpBasicPermissions () сразу после каждого вызова.
Разрешить одной службе вызывать другую, но не обе. Если это так, какой из них выбрать? Что мне делать с логикой для одного, который не может вызвать другого?
Использование делегатов для внедрения зависимых методов обслуживания в вызываемые методы обслуживания. Блин, это звучит ужасно.
Это те, о которых я могу думать, но я уверен, что есть некоторые, которые я пропускаю.
Мысли
Заранее спасибо.