Используя шестибитное представление с одним и двумя дополнениями, я пытаюсь решить следующую проблему:
12 - 7
Теперь я беру 12 в двоичном формате и 7 в двоичном.
12 = 001100 - 6 bit
7 = 000111 - 6 bit
Тогда, переверну ли я бит для дополнения до двух и добавлю единицу?
12 = 110011 ones complement
+ 1
-------
001101
7 = 111000 ones complement
+ 1
---------
111001
тогда, Entity Framework 4 (чистый POCO, пользовательский контекст данных) Шаблон репозитория Шаблон единицы работы Внедрение зависимости Контроллер-посредник уровня обслуживания ...
Вот сценарий:
В общем, все крутые вещи. :)
Поток событий для базовой операции пользовательского интерфейса («Добавление сообщения»):
Теперь, Я пытаюсь понять, где я могу разместить свою проверку.
На этом этапе мне нужны два типа проверки:
Теперь я читал «Programming Entity Framework, Second Edition» Джули Лерман (что превосходно, кстати) и искал возможность подключения к событию SavingChanges для выполнения «last- минута "проверка. Это был бы хороший способ гарантировать, что проверка всегда происходит всякий раз, когда я делаю «что-то» (добавляю, изменяю, удаляю), но это также немного поздно IMO (поскольку элементы уже находятся в диспетчере состояний) - Итак, что я могу сделать, если проверка не удалась, удалить их?
Конечно, я мог бы заставить мои POCO реализовать интерфейс (скажем, «IValidatable») и вызывать метод этого интерфейса во время этого события.
Но это кажется «слишком поздно» для проверки бизнеса - это ли консенсус?
Я в основном ищу здесь руководства, я пытаюсь разработать многократно используемую интеллектуальную схему проверки для сложной бизнес-логики, учитывая мою вышеупомянутую архитектуру.
Еще одна кривая для вы - как вы знаете, POCO с EF означают, что POCO имеют все свойства в БД, поэтому у меня может быть свойство «PostID» с аксессорами get / set (поскольку EF необходимо получить / установить эти свойства).
Но проблема в том, что «PostID» - это столбец идентификатора , так как мне защитить поле от явной установки? Э. g, если я (по какой-то причине) сделаю следующее:
var post = service.FindSingle(10);
post.PostId = 10;
unitOfWork.Commit();
Это вызовет исключение SqlException. Как я могу предотвратить это? Я не могу «скрыть» свойство (сделать его частным или даже внутренним), так как POCO находятся в отдельной сборке репозитория.
Примечание о проверке - я планирую создать собственные исключения (производные от Exception ). Поэтому, когда проверка не выполняется, мне нужно выбросить эти исключения.
Таким образом, я могу закодировать что-то вроде этого на своем контроллере:
[HttpPost]
public ActionResult AddPost(Post post)
{
try
{
IUnitOfWork uow = new UnitOfWork();
postService.Add(post);
uow.Commit();
}
catch(InvalidPostOperation ipo)
{
// add error to viewmodel
}
}
Придется ли мне вручную выполнять проверку на уровне сервиса каждый раз, когда я буду добавлять? Тогда как я могу справиться с сохранением? (поскольку это относится к Единице работы, а не на уровне обслуживания).
Итак, чтобы это не было вопросом "повсюду", вот мои вопросы:
Любые мысли будут очень признательны.
Приношу извинения, если этот пост тоже " long ", но это важный вопрос, который можно решить разными способами, поэтому я хотел предоставить всю информацию, чтобы получить наилучший ответ.
Спасибо.
ИЗМЕНИТЬ
Приведенный ниже ответ полезен, но я все еще (в идеале) ищу другие мысли. Кто-нибудь еще?