Если бы мне пришлось выбирать, я бы выбрал второй вариант, чтобы мои объекты не были связаны с какой-либо инфраструктурой DAL и были полностью сфокусированы на логике домена.
Однако мне это тоже не очень нравитсяподход.Я предпочитаю больше использовать AOP-подход к безопасности и ролям, добавляя атрибуты к своим методам обслуживания приложений.
Другая вещь, которую я бы изменил, - это уход от мышления «CRUD».Вы можете предоставить много подробных параметров безопасности, если вы защищаетесь от определенных команд / вариантов использования.Например, я сделал бы это:
public class MyApplicationService
{
[RequiredCommand(EmployeeCommandNames.MakeEmployeeRedundant)]
public MakeEmployeeRedundant(MakeEmployeeRedundantCommand command)
{
using (IUnitOfWork unitOfWork = UnitOfWorkFactory.Create())
{
Employee employee = _employeeRepository.GetById(command.EmployeeId);
employee.MakeRedundant();
_employeeRepository.Save();
}
}
}
public void AssertUserHasCorrectPermission(string requiredCommandName)
{
if (!Thread.CurrentPrincipal.IsInRole(requiredCommandName))
throw new SecurityException(string.Format("User does not have {0} command in their role", requiredCommandName));
}
Где бы вы перехватили вызов первого метода и вызвали второй метод, передавая то, что они должны иметь в своей роли.
Вот ссылка на то, как использовать единство для перехвата: http://litemedia.info/aop-in-net-with-unity-interception-model