J'essaie de faire fonctionner cette générique DuplicateValidationRule, qui vérifie fondamentalement une collection pour les doublons (basé sur un type d'objet métier générique transmis). Permet de prendre l'objet métier IBankAccount par exemple:Générique DuplicateValidationRule (Vérification des objets métier pour les doublons)
public interface IBankAccount : IMyBusinessObjectBase
{
IBank Bank
{
get;
set;
}
IBankAccountType BankAccountType
{
get;
set;
}
string AccountName
{
get;
set;
}
string AccountNumber
{
get;
set;
}
DateTime EffectiveDate
{
get;
set;
}
}
Disons que j'ai la collection suivante de 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);
Paramètres:
T = BusinessObject Classe (personne, Adresse, BankAccount, Bank, BankBranch etc) string [] entityPropertyName = Tableau de propriétés à inclure lors de la recherche de doublons.
Utilisons maintenant le senario suivant: Disons que je veux vérifier les BankAccounts en double, en cochant la case sur le numéro de compte, et la banque. Le numéro de compte est unique dans une banque, mais peut exister dans une autre banque. Donc, si vous regardez la liste ci-dessus, Acc1, Acc2 et Acc3 est valide. Acc4 est invalide car ce numéro de compte existe déjà pour cette banque. Ainsi, l'appel à valider ressemblerait à ceci.
DuplicateValidationRule.Validate (newBankAccountEntry, nouvelle chaîne [] {"AccountNumber", "Bank.Name"});
Le code ci-dessus passe dans l'entité commerciale pour vérifier les doublons et le tableau de propriétés qui inclut les propriétés à vérifier.
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;
}
Cette méthode est utilisée pour obtenir l'objet réel de vérifier les doublons sur:
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;
}
Le code ci-dessus fonctionne, mais il a un défaut: Le code ci-dessus ne fonctionnera que si vous vérifiez une propriété unique pour un match en double:
DuplicateValidationRule.Validate<IBankAccount>(newBankAccountEntry,new string[] {"AccountNumber"});
Lorsque vous ajoutez une propriété à vérifier contre, par exemple:
DuplicateValidationRule.Validate<IBankAccount>(newBankAccountEntry,new string[] {"AccountNumber","Bank.Name"});
puis le code vérifie la deuxième propriété, sur le prochain occurrence dans la liste. Il devrait tester toutes les propriétés dans le .Any pour l'objet actuellement en cours de comparaison. En espérant que cela fait sourire, peut-être que quelqu'un peut me donner des conseils sur la façon de résoudre ce problème! Merci :)
On dirait que votre code pourrait fonctionner ... Il semble être une meilleure solution à celle que je viens de trouver. Permettez-moi de poster ma solution actuelle et j'espère que certaines entrées de l'utilisateur me diront lequel serait le mieux à utiliser. Merci beaucoup!! – FaNIX