.NET - Стратегии избежать волшебной строки

В коде на работе у нас есть много использования волшебных строк как следующий фрагмент кода:

if (user.HasRight("Profile.View")) {...}

Таким образом, существует много мест, куда мы передаем строку в качестве параметра, чтобы видеть, имеет ли пользователь определенное право. Мне не нравится это, потому что это генерирует много волшебных строк.

Каков был бы лучший способ сделать его?

Перечисление, Постоянное, класс?

8
задан ruffin 29 September 2015 в 20:21
поделиться

6 ответов

В этом конкретном случае используйте Enum.Не будет никаких волшебных строк, и если Enum изменится (таким образом, чтобы сломать решение волшебных строк), приложение больше не будет компилироваться.

public enum ProfilePermissions
{
    View,
    Create,
    Edit,
    Delete
}

Тогда вы можете просто иметь:

if(user.HasRight(ProfilePermissions.View)) { }

Вы также можете использовать класс, но тогда вы ограничиваете себя, когда дело касается более сложных сценариев. Например, простое изменение Enumeration на что-то вроде:

public enum ProfilePermissions
{
    View = 1,
    Create = 2,
    Edit = 4,
    Delete = 8
}

позволит вам использовать побитовые операторы для более сложных разрешений (например, ситуация, когда пользователю нужно создать или удалить):

if(user.HasRight(ProfilePermissions.Create | ProfilePermissions.Delete));
17
ответ дан 5 December 2019 в 05:44
поделиться

Это достаточно распространено и в .NET Framework. Примерами являются System.Windows.DataFormats и System.Net.WebRequestMethods.Http. Вам нужна разновидность только для чтения:

public static class MumbleRights {
  public static readonly string ProfileView = "Profile.View";
  // etc..
}
8
ответ дан 5 December 2019 в 05:44
поделиться

Я поддерживаю способ, показанный "Justin Niessner". Но в некоторых случаях я бы предпочел написать следующую конструкцию кода.

public  class User
    {
        public Permission Permission { get; set; }

    }
    public abstract class Permission
    {

    }
    public class ViewPermission:Permission
    {

    }

и вы можете использовать его как

User user=new User();
            if(user.Permission is ViewPermission)
            {

            }
0
ответ дан 5 December 2019 в 05:44
поделиться

Создайте class, который строго типизирует эти свойства, например

public static class UserInfo
{
  public static bool CanViewProfile { get { return User.HasRight("Profile.View"); } }
}

. Это сохранит ваши «волшебные строки» в одном месте в вашем коде. Перечисление также будет работать, но, на мой взгляд, не так читаемо.

Примечание: мой пример предназначен для использования в качестве прокси свойства для вошедшего в систему пользователя, то есть статического класса. Если вам нужно что-то, что будет работать с более непосредственными данными (например, список пользователей), этот тип класса должен быть нестатическим и создаваться для каждой учетной записи пользователя.

1
ответ дан 5 December 2019 в 05:44
поделиться

Методы расширения! Держите их в одном месте, чтобы отслеживать все магические струны.

public static class UserRightsExtensions {
  public static bool CanReadProfile(this User user)
  {
    return user.HasRight("Profile.View");
  }

  // etc..
}

Затем вы можете:

if (user.CanReadProfile()) .....
3
ответ дан 5 December 2019 в 05:44
поделиться

В C # можно создавать константные строки.

Вы можете определить все строки в заголовке следующим образом:

const string PROFILE_VIEW "Profile.View";

Не уверен, что это «лучший» способ, но он определенно лучше, чем наличие магических значений в коде.

0
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: