2009-03-09 2 views
5

У меня есть класс RentalProperty, который выглядит примерно так:DDD Политики безопасности пользователя

class RentalProperty 
{ 
    Money MonthlyRent; 
    List<MaintainenceCall> MaintainenceCalls; 
} 

Из моего понимания, с помощью DDD, чтобы изменить MonthlyRent, я хотел бы получить RentalProperty, изменить свойство MonthlyRent и вызвать RentalPropertyRepository .Сохранить(). Тот же процесс будет обработан, чтобы добавить новый MaintainenceCall.

Проблема заключается в том, что, например, Разнорабочий должен иметь возможность добавлять MaintainenceCall, но не должен иметь права на изменение MonthlyRent. Как я должен реализовать эту (а также другую аналогичную) политику безопасности?

+0

Возможно, я действительно задаю один и тот же фундаментальный вопрос, как вы, но я начал сначала рисковать в другом направлении. http://stackoverflow.com/questions/5374176/can-ddd-repositories-be-aware-of-user-context – jpierson

ответ

2

АОП. PostSharp действительно хорош для таких вещей.

Потому что безопасность на самом деле является сквозной проблемой.

+0

Интересно, поскольку я тоже вырвал эту концепцию. +1 – eduncan911

+1

Безопасность не так однозначно, как нечто вроде ведения журнала. Когда дело доходит до регистрации, единственное, что отличается от всех объектов, - это то, что регистрируется. Независимо от того, разрешено ли пользователю делать что-либо, может зависеть от конкретной информации в домене. –

8

Вкратце, вы должны применить это бизнес-правило непосредственно в своей модели. В вашем случае, непосредственно в свойствах getter и setter MonthlyRent. Мы все знаем, насколько сложным может быть множество проверок и уровней безопасности; так что это то, что для спецификации.

В учебнике для DDD представлена ​​концепция Технические характеристики, для этой цели фокусировки света на самой модели. Вы сначала настроите свой геттер и сеттер, как описано выше, чтобы получить функциональность. Затем, во время вашего рефакторинга, попробуйте сделать модель чище, абстрагировав длинный код getter/setter в классах спецификаций.

Employee employee = 
    employeeRepository.findEmployee(employeeID); 

Specification employeeCanModifyRent = new 
    Specification(
     new EmployeeHasAccessToManagement() 
     , new EmployeeHasAccessToMoney()); 

if(employeeCanModifyRent.isSatisfiedBy(employee)) 
{ 
    rentService.changeRent(); 
} 
else 
{ 
    throw new exception("Access denied."); 
} 

Чтение кода делает его очень очевидным для того, что именно делает код. Это основная концепция DDD сама по себе. Спецификации должны быть очень простыми и простыми.

Этот код исходит из Domain-Driven Design Quickly, который быстро и быстро считывается для DDD. Это действительно кратковременная книга о DDD, которая требует чтения в течение нескольких часов. Всего 100 страниц.

Смежные вопросы