Я пытаюсь запустить этот общий DuplicateValidationRule, который в основном проверяет коллекцию для дубликатов (на основе общего типа бизнес-объекта, переданного в). Давайте принимать IBankAccount Бизнес-объект, например:Generic DuplicateValidationRule (проверка бизнес-объектов для дубликатов)
public interface IBankAccount : IMyBusinessObjectBase
{
IBank Bank
{
get;
set;
}
IBankAccountType BankAccountType
{
get;
set;
}
string AccountName
{
get;
set;
}
string AccountNumber
{
get;
set;
}
DateTime EffectiveDate
{
get;
set;
}
}
Допустим, у меня есть следующий набор IBankAccount
IBankAccount acc1 = new BankAccount();
acc1.AccountName = "Account1";
acc1.AccountNumber = "123456";
acc1.Bank = FetchBusinessObjectByID(1); //Fetch Bank 1
IBankAccount acc2 = new BankAccount();
acc2.AccountName = "Account2";
acc2.AccountNumber = "654321";
acc2.Bank = FetchBusinessObjectByID(1); //Fetch Bank 1
IBankAccount acc3 = new BankAccount();
acc3.AccountName = "Account3";
acc3.AccountNumber = "123456";
acc3.Bank = FetchBusinessObjectByID(2); //Fetch Bank 2
IBankAccount acc4 = new BankAccount();
acc4.AccountName = "Account3";
acc4.AccountNumber = "123456";
acc4.Bank = FetchBusinessObjectByID(1); //Fetch Bank 2
ICollection<IBankAccount> bankAccounts = new List<IBankAccount>();
bankAccount.Add(acc1);
bankAccount.Add(acc2);
bankAccount.Add(acc2);
bankAccount.Add(acc4);
Параметры:
T = BusinessObject Тип класса (Person, адрес, ВагЛАссоипЬ, Bank, BankBranch и т. Д.) String [] entityPropertyName = Массив свойств, которые нужно включить при проверке дубликатов.
Теперь позвольте использовать следующий сценарий: Предположим, я хочу проверить дубликаты BankAccounts, проверив номер счета и банк. Номер счета уникален в банке, но может существовать в другом банке. Поэтому, если вы посмотрите на список выше, то действуют Acc1, Acc2 и Acc3. Acc4 недействителен, поскольку этот номер счета для этого банка уже существует.
Итак, вызов для проверки будет выглядеть следующим образом.
DuplicateValidationRule.Validate (newBankAccountEntry, new string [] {"AccountNumber", "Bank.Name"});
Приведенный выше код передается в бизнес-сущности для проверки дубликатов и массива свойств, который включает в себя свойства, которые необходимо проверить.
public ValidationError Validate<T>(T entityProperty, string[] entityPropertyName)
{
ICollection<T> businessObjectList = FetchObjectsByType<T>();
bool res = true;
for (int i = 0; i < entityPropertyName.Length; i++)
{
object value = getPropertyValue(entityProperty, entityPropertyName[i]);
//By Using reflection and the getPropertyValue method I can substitute the properties to //compare.
if (businessObjectList.Any(x => getPropertyValue(x, entityPropertyName[i]).Equals(value) &&
x.GetType().GetProperty("ID").GetValue(x,null).ToString()
!= ((IBusinessObjectBase)entityProperty).ID.ToString()))
res &= true;
else
res &= false;
}
if (res)
return new ValidationError(_DuplicateMessage);
else
return ValidationError.Empty;
}
Этот метод используется, чтобы получить реальный объект, чтобы проверить дубликаты на:
private static object getPropertyValue(object obj, string propertyName)
{
string[] PropertyNames = propertyName.Split('.');
object propertyValue = obj;
for (int i = 0; i < PropertyNames.Length; i++)
{
propertyValue = propertyValue.GetType().GetProperty(PropertyNames[i], BindingFlags.Public |
BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy).
GetValue(propertyValue, null);
}
if (propertyValue.GetType() == typeof(string))
return propertyValue.ToString().ToLower(CultureInfo.CurrentCulture);
else
return propertyValue;
}
Приведенный выше код работает, но имеет недостаток: Код выше будет работать только если вы установите одно свойство для дубликата матча:
DuplicateValidationRule.Validate<IBankAccount>(newBankAccountEntry,new string[] {"AccountNumber"});
При добавлении еще одно свойство, чтобы проверить против, например:
DuplicateValidationRule.Validate<IBankAccount>(newBankAccountEntry,new string[] {"AccountNumber","Bank.Name"});
тогда код будет проверять второе свойство, на следующем появлении в списке. Он должен проверять все свойства в .Any для текущего сравниваемого объекта. Надеюсь, это заставляет, может быть, кто-то может дать мне несколько советов о том, как это исправить! Спасибо :)
Похоже, ваш код может работать ... Это похоже на лучшее решение для того, которое я только что нашел. Позвольте мне опубликовать мое текущее решение, и, надеюсь, какой-то пользовательский ввод скажет мне, что лучше использовать. Большое спасибо!! – FaNIX