powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как ограничить доступ?
25 сообщений из 27, страница 1 из 2
Как ограничить доступ?
    #39862005
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Частенько сталкиваюсь с такой проблемой, что один класс представляет собой контейнер / провайдер
и отдаёт свои данные в объектах другого класса. Вот пример нерабочего примера как бы хотелось это видеть.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    class Provider
    {
        public class NestedData
        {
            public string Name { get; private set; }

            private void SomeOtherRestrictedMember() { }
        }

        private NestedData _nestedData;

        public Provider()
        {
            _nestedData = new NestedData();
            _nestedData.Name = "Some Name";
            _nestedData.SomeOtherRestrictedMember();
        }
    }



Другими словами часть методов являются публичным интерфейсом, а другую часть хочется огородить от доступа извне но в тоже время разрешить доступ из Provider-а.

Хотелось бы услышать как вы решаете эти проблемы.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862008
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

ну вроде ж наоборот, Provider нужно делать Nested, например
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    class Data
    {
        public class NestedProvider
        {
            private Data _data;

            public NestedProvider(Data data)
            {
                _data = data;
                _data.Name = "Some Name";
                _data.SomeOtherRestrictedMember();
            }
        }
        public NestedProvider GetProvider() { return new NestedProvider(this); }

        public string Name { get; private set; }

        private void SomeOtherRestrictedMember() { }
    }
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862012
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Когда один nested class то можно вывернуть на изнанку. Но такой метод не работает если их несколько.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862015
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

несколько провайдеров или несколько контейнеров?
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862017
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если провайдер порождает некие классы и хочет их в дальнейшем эксклюзивно контролировать, он может при создании передавать внутрь этих классов некую инъекцию, которая позволит ими управлять, которая, разумеется, не будет доступна другим классам.
Но тут надо быть аккуратным - не допустить утечки памяти из-за обратных ссылок.

Но задача выглядит странноватой, лучше рассматривать конкретную задачу, а не абстрактный пример.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862025
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант (если я правильно понял проблему):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
    class Data1
    {
        private Data1() { }
        //...
        public class NestedProvider
        {
            Data1 _data;
            public NestedProvider()
            {
                _data = new Data1();
                //...
            }
        }
    }
    class Data2
    {
        private Data2() { }
        //...
        public class NestedProvider
        {
            Data2 _data;
            public NestedProvider()
            {
                _data = new Data2();
                //...
            }
        }
    }
    class AllMyDataProvider
    {
        Data1.NestedProvider _provider1 = new Data1.NestedProvider();
        Data2.NestedProvider _provider2 = new Data2.NestedProvider();
        //...
    }

...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862032
L.Otujktd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikron,

А что требуется получить на выходе? Какая реальная задача решается?
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862051
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRmikron,

несколько провайдеров или несколько контейнеров?
Провайдер или контейнер один. Несколько нестед классов.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862055
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНо задача выглядит странноватой, лучше рассматривать конкретную задачу, а не абстрактный пример.

Возьмём простой пример с одним нестед классом. пусть мы разрабатываем простой  LRU cache.
Для внутреннего представления используем нестед класс Node в который поместим ключ типа К, значение V
и счётчик попаданий HitCounter. Счётчик может читать каждый, менять только контейнер.
Для хранения элементов кеша мы реализуем односвязный список на классе Node, добавим ему элемент Next.
Доступ к нему должен иметь только контейнер. Про методы я фантазировать не буду. Надеюс на этом премере можно разобрать проблему.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class LruCache<K,V> : IEnumerable<Node>
{

public class Node
{
public readonly K Key;
public readonly V Value;
public int HitCounter { get; private set;}
private Node Next;
}

private Node _top;

}
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862097
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если доступ к счетчику имеет только контейнер, значит и доступ к узлу предоставляет только контейнер (иначе на каком основании он будет крутить этот счетчик).
А раз это так - нет никакой необходимости засовывать счетчик внутрь узла, это будет свойство оболочки узла или вообще параллельная структура.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862100
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronНадеюс на этом премере можно разобрать проблему.Нет))
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862171
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЕсли доступ к счетчику имеет только контейнер
Доступ на изменение - да, только контейнер. Статистика о работе кэша публична. Доступ на чтение не ограничен.

Shocker.ProЕсли доступ к счетчику имеет только контейнер, значит и доступ к узлу предоставляет только контейнер (иначе на каком основании он будет крутить этот счетчик).
А раз это так - нет никакой необходимости засовывать счетчик внутрь узла, это будет свойство оболочки узла или вообще параллельная структура.

Я не не совсем понял ваши рассуждения. В примере основной пункт в том что контейнер представляет наружу для для каждого узла
публичный интерфейс, по которому можно читать <Key, Value, HitCounter>.
Покажите наброски кода, как вы предлагаете ограничить видимость.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862173
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronВ примере основной пункт в том что контейнер представляет наружу для для каждого узла
публичный интерфейс, по которому можно читать <Key, Value, HitCounter>.В твоем примере как раз-таки не так. Контейнер предоставляет не "для каждого узла", а он предоставляет сам узел, а узел уже предоставляет <Key, Value, HitCounter>. А вот если делать как ты сказал, то тогда вопросов не будет - контейнер будет предоставлять набор <Key, Value, HitCounter readonly > по запросу на получение узла, а сам узел станет внутренней сущностью контейнера
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862181
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.PromikronВ примере основной пункт в том что контейнер представляет наружу для для каждого узла
публичный интерфейс, по которому можно читать <Key, Value, HitCounter>.В твоем примере как раз-таки не так. Контейнер предоставляет не "для каждого узла", а он предоставляет сам узел, а узел уже предоставляет <Key, Value, HitCounter>
Всё так: Узел с ограниченными правами доступа и есть публичный интерфейс. Слово "интерфейс" надо понимать здесь в широком смысле.

Shocker.ProА вот если делать как ты сказал, то тогда вопросов не будет - контейнер будет предоставлять набор <Key, Value, HitCounter readonly > по запросу на получение узла, а сам узел станет внутренней сущностью контейнера

Покажи кодом как ты это видиш.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862184
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronПокажи кодом как ты это видиш.Я вижу так, что контейнер возвращает неизменяемую сущность (узел).

Или ты хочешь, чтобы пока потребитель как-то использует узел, контейнер параллельно менял у него счетчик неожиданно для потребителя? А потребитель должен самостоятельно менять Key и Value у этого узла, а контейнер должен это как-то подхватывать?
Я не понимаю пока, зачем нужна такая интерактивность в этом узле.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862301
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИли ты хочешь, чтобы пока потребитель как-то использует узел, контейнер параллельно менял у него счетчик неожиданно для потребителя?
Непонятно какими путями ты пришёл к "паралельно". Про многопоточность мы не говорили. А в однопоточном приложении непонятно как ты пришёл к "нежиданно". в однопоточном приложении это допустимо и даже желательно. Если консумент получил доступ к узлу а затем выполнил несколько запросов на поиск этого же элемента, то статистика должна быть корректно отражена.

Shocker.ProА потребитель должен самостоятельно менять Key и Value у этого узла, а контейнер должен это как-то подхватывать?
Ни потребитель не может их менять и ни контейнер: эти элементы для всех readonly.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862306
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronЕсли консумент получил доступ к узлу а затем выполнил несколько запросов на поиск этого же элемента, то статистика должна быть корректно отражена.ну так при повторном запросе ему приходит новый узел с новой статистикой
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862308
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ вижу так, что контейнер возвращает неизменяемую сущность (узел).

Я понимаю что ты имееш в виду. Так конечно тоже можно, но имеет свои недостатки. Например при итерации создаётся много временных объектов.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862310
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а решение я уже писал выше. Провайдер интегрирует в узел свой делегат, через который может менять статистику. Но тогда нужно следить за корректностью сборки мусора из-за обратных ссылок.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862348
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Послушаем, может ещё другие решения кто предложит.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862352
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если разбить на два проекта?
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862357
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант, как я бы сделал "спинным мозгом" если бы делал всё в одном проекте.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
public class DataSource
{
    public string Name { get; protected set; }
    public int HitCounter { get; protected set; }
}


public class Provider
{
    private class DataSourceExt : DataSource
    {
        internal void SetCounter(int value)
        {
            HitCounter = value;
        }
        internal void SetName(string value)
        {
            Name = value;
        }
    }

    public DataSource Data { get; private set; }

    public Provider()
    {
        var ds = new DataSourceExt();
        ds.SetName("New Name");
        ds.SetCounter(1);
        Data = ds;
    }

    public void SetCounter(int value)
    {
        ((DataSourceExt)Data).SetCounter(value);
    }
}


Код: c#
1.
2.
3.
4.
5.
static void Main()
{
    var p = new Provider();
    p.SetCounter(2);
}
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862362
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff,


Да, так тоже хорошо.

SetCounter и SetName я бы сделал public. их никто всё равно не увидит.
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862364
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikron,

internal
...
Рейтинг: 0 / 0
Как ограничить доступ?
    #39862407
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

обясни, почему?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как ограничить доступ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]