У меня есть набор проектов ASP.NET 4, кульминацией которых является приложение MVC (3 RC2).В решении используются проверки Unity и EntLib для сквозного внедрения и проверки зависимостей.Оба прекрасно работают для внедрения репозитория и реализаций сервисного уровня.
Однако я не могу понять, как выполнить проверку дубликатов ключей.Например, когда пользователь регистрируется, мы хотим убедиться, что он не выберет идентификатор пользователя, который уже используется кем-то другим.Для этого типа проверки объект проверки должен иметь ссылку на репозиторий ... или каким-либо другим способом получить ссылку IQueryable / IEnumerable для проверки других строк, уже находящихся в БД.
У меня есть класс UserMetadata, в котором есть все установщики и получатели свойств для пользователя, а также все соответствующие атрибуты DataAnnotations и EntLib Validation.Существует также класс UserEntity, реализованный с использованием шаблонов EF4 POCO Entity Generator.UserEntity зависит от UserMetadata, потому что у него есть MetadataTypeAttribute.У меня также есть класс UserViewModel, который имеет точно такой же атрибут MetadataType.Таким образом, я могу применять одни и те же правила проверки через атрибуты как к сущности, так и к модели представления.
Нет никаких конкретных ссылок на классы репозитория вообще.Все репозитории вводятся с использованием Unity.Существует также сервисный уровень, который получает внедрение зависимости.В проекте MVC классы реализации уровня обслуживания вводятся в классы контроллера (классы контроллера содержат только ссылки на интерфейс уровня обслуживания).Затем Unity внедряет реализации репозитория в классы уровня обслуживания (классы обслуживания также содержат только ссылки на интерфейс).
Я экспериментировал с DataAnnotations CustomValidationAttribute в классе метаданных.Проблема заключается в том, что метод проверки должен быть статическим, и метод не может напрямую создать реализацию репозитория.Мой интерфейс репозитория - IRepository , и у меня есть только один единственный класс реализации репозитория, определенный как EntityRepository для всех объектов домена.Чтобы создать экземпляр хранилища в явном виде, мне нужно было бы сказать новый EntityRepository (), что привело бы к циклическому графу зависимостей:Я также попытался создать пользовательский EntLib Validator вместе с пользовательским атрибутом проверки.Здесь у меня нет той же проблемы со статическим методом.Я думаю, я мог бы заставить это работать, если бы я мог просто выяснить, как заставить Unity внедрить мой EntityRepository в класс валидатора ... что я не могу.Прямо сейчас весь код проверки находится в моей библиотеке классов метаданных, так как именно туда должен идти пользовательский атрибут проверки.
Есть какие-нибудь идеи о том, как выполнять проверки, которые необходимо проверять в соответствии с текущим состоянием хранилища?Можно ли использовать Unity для внедрения зависимости в библиотеку классов более низкого уровня?