Выборочное ограничение доступа к свойству для определенных модулей - PullRequest
0 голосов
/ 19 мая 2018

У меня есть класс Thing, который десериализован из файла JSON с использованием DataContractJsonSerializer:

[DataContract]
class Thing
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    // and so on...
}

Чтобы это работало, все свойства должны иметь public или, по крайней мере, internalsetters.

Два других модуля (сборки) должны иметь доступ к этому классу:

  • ThingView должен иметь доступ только для чтения к большинству атрибутов.
  • ThingEditor нужен полный доступ ко всем атрибутам.

Я мог бы установить сеттеры internal, но тогда ThingEditor не получил бы полный доступ.

Чтобы ограничить доступ для ThingView class, лучшая идея, которую я могу придумать, - создать оболочку только для чтения класса Thing.Но это потребовало бы большого количества дублирования кода.

Существуют ли лучшие способы добиться большей инкапсуляции для подобного случая?

(Фактический код содержит около 20 классов этого типа, некоторыеиз которых образуют вложенные структуры. Кроме того, существует более двух модулей, которым требуется либо чтение, либо полный доступ к свойствам.)

1 Ответ

0 голосов
/ 19 мая 2018

В спецификациях нет ничего нестандартного, что могло бы достичь этого.Тем не менее, вы можете сделать что-то подобное, например,

public interface IReadOnlInterface
{
   int Id { get; }
   string Name { get; }
}

public interface IInterface
{
      int Id { get; set; }
      string Name { get; set; }
}

internal class Thing : IInterface , IReadOnlInterface
{
   public int Id { get; set; }
   public string Name { get; set; }
}

Однако ничто не мешает программистам с грязными мизинцами, переходящими к другому интерфейсу.Если проблема только во время выполнения, то с интерфейсами все должно быть в порядке.В противном случае вам придется создать лучший дизайн API с защищенными данными и объектами прокси-типа с доступом только для чтения, хотя, возможно, у кого-то есть идея получше.

...