Еще один подход должен использовать членство ASP.NET для аутентификации, связать Ваш Пользовательский класс с участниками ASP.NET и использовать Ваш Пользовательский класс для большего количества детализированных полномочий. Мы делаем это, потому что это позволяет изменять поставщиков аутентификации очень легко, все еще сохраняя способность иметь сложную систему разрешения.
В целом, стоит помнить, что аутентификация/идентификационные данные и полномочия хранения являются не обязательно той же проблемой.
Я написал это для тестирования коллекций, где порядок не важен:
public static bool AreCollectionsEquivalent<T>(ICollection<T> collectionA, ICollection<T> collectionB, IEqualityComparer<T> comparer)
{
if (collectionA.Count != collectionB.Count)
return false;
foreach (var a in collectionA)
{
if (!collectionB.Any(b => comparer.Equals(a, b)))
return false;
}
return true;
}
Не так элегантно, как при использовании SequenceEquals
, но это работает.
Конечно, чтобы использовать его, вы просто делаете:
Assert.IsTrue(AreCollectionsEquivalent<MyType>(collectionA, collectionB, comparer));
Это работает, если я добавлю IEqualityComparer<T>
, как описано в MSDN , и если я использую Enumerable.SequenceEqual
. Отметьте, однако, что теперь порядок элементов важен.
В модульном тесте
//CollectionAssert.AreEquivalent(list1, list2); // Does not work
Assert.IsTrue(list1.SequenceEqual(list2, new MyPersonEqualityComparer())); // Works
IEqualityComparer
public class MyPersonEqualityComparer : IEqualityComparer<MyPerson>
{
public bool Equals(MyPerson x, MyPerson y)
{
if (object.ReferenceEquals(x, y)) return true;
if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null)) return false;
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(MyPerson obj)
{
if (object.ReferenceEquals(obj, null)) return 0;
int hashCodeName = obj.Name == null ? 0 : obj.Name.GetHashCode();
int hasCodeAge = obj.Age.GetHashCode();
return hashCodeName ^ hasCodeAge;
}
}