Сначала давайте посмотрим на переписывание атрибута ...
public override bool IsValid(object value)
{
var db = new CoinDataContext();
//Return whether none of the email contains the specified value
return db.Emails.Count(e => e.Email1 == value.ToString()) == 0;
}
Кроме того, не было необходимости приводить (c == 0)
в качестве логического значения, поскольку в результате этой операции уже выполняется логическое преобразование. И тип bool
является псевдонимом для Boolean
точно так же, как int
является псевдонимом для Int32
. Либо приемлемо. Я предпочитаю строчную версию себя.
Как Алекс уже предложил в своем ответе , это не будет верным способом определения того, является ли адрес электронной почты уникальным, когда он входит в базу данных. Только то, что он уникален на момент проверки.
Наконец, и немного не по теме ... У меня написано некоторые расширения linq, такие как следующий класс. Его использование позволило бы мне переписать возвращаемый атрибут на db.Emails.None(e => e.Email1 == value.ToString());
. Это делает его немного более читабельным.
Обновление
Не существует способа определения уникальности значения в базе данных без перехода в базу данных и сравнения строк с записанными значениями. Вам все еще нужно создать экземпляр в базе данных. Однако я хотел бы взглянуть на , разделяя эти проблемы на такие области, как уровень обслуживания и уровень данных (отдельные проекты из проекта веб-сайта MVC). Ваш уровень данных будет обрабатывать исключительно все, что связано с базой данных. Если вы хотите, я могу написать несколько примеров того, как вы должны отделить CoinDataContext от самого атрибута?
Чтобы решить еще одну проблему, мы убираем необходимость запроса внутри атрибута, но вам все равно нужен вызов базы данных и указание таблицы, которую вы хотите использовать.
Однако, поскольку это атрибут, я не уверен на 100%, можете ли вы использовать лямбда-выражения linq в атрибуте it, поэтому ваш атрибут должен оставаться обобщенным таким образом.
Проект уровня данных
Этот слой будет содержать разные классы, относящиеся к разным таблицам. Класс ниже посвящен столу электронной почты.
Email Mapper class
public static class EmailMapper
{
public static void IsValid(Func<string, bool> query)
{
var db = new CoinDataContext();
return db.Emails.Count(query) == 0;
}
}
Сервисный уровень проекта
Этот уровень отвечает за общую проверку объектов, но также используется для перехода на другие уровни, такие как внешние API.
Класс EmailService
public static class EmailService
{
public static IsValid(string address)
{
bool isValid = false;
//...Check email is valid first with regex. Not done.
isValid = RegexHelper.IsEmailAddressValid(address);
//Go to the database and determine it's valid ONLY if the regex passes.
return isValid ? EmailMapper.IsValid(x=> x.Email == address) : false;
}
}
Класс атрибутов в веб-проекте
public override Boolean IsValid(Object value)
{
return EmailService.IsValid(value.ToString());
}