|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
МСУВсё-равно я не понимаю. 1. Что-то "статическая информация"? 2. Что мешает инициализировать класс через конструктор, а не через прямую кишку? 3. При уходе от статики (статический класс, статический конструктор) ты имеешь возможность прикрутить интерфейсы (зависимости). 4. Профит? 1. Ну банально - это информация нужная Классу_1 для работы. Предположим это КонекшнСтринг. Если ему его не дадут, то как он Сессию откроет ? 2. Хм. А как я могу проинициализировать через конструктор, и обеспечить, что я это сделаю до обращений от клиентского кода ? Я вижу единственный вариант: статический конструктор. Он выполнится гарантированно до любых обращений пользовательского кода (пользовательскому коду будет не доступен статический конструктор). 3. Да все клево. Но как бы сделать так, чтобы я успел проинициализировать класс до обращений из польщовательского кода ? 4. Два миллиона зеленых мертвых президентов меня устроит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 12:22 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
В общем. Спасибо товарищи Земляне ! Я подумал. Действительно, самое лучшее будет, пожалуй, через ленивое обращение к статическому инициализируемому свойству. Все отлично укладывается. Класс_2 статически инициализирует Класс_1. При вызове методов Класса_2 из клиентского кода, идет проверка по типу Синглтона, мол если инстанс инициализирован (то бишь, если нужные для работы данные были заданы), то все ОК. Если же не инициализирован, то значит статическую переменную не инициализировали - и, как мне и нужно, идем по второму алгоритму. Надо будет еще позаботится о правах доступа, но это у меня уже есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 12:22 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Изюбр1. Ну банально - это информация нужная Классу_1 для работы. Предположим это КонекшнСтринг. Если ему его не дадут, то как он Сессию откроет ? Если классу что-то нужно для работы, используют конструктор этого класса. Изюбр2. Хм. А как я могу проинициализировать через конструктор, и обеспечить, что я это сделаю до обращений от клиентского кода ? Я вижу единственный вариант: статический конструктор. Он выполнится гарантированно до любых обращений пользовательского кода (пользовательскому коду будет не доступен статический конструктор). Какая-то каша... Проинициализировать через конструктор что ты не сможешь? Причем тут статический конструктор я так и не понял. Обычный констрктор что, не гарантированно выполнится что-ли? Изюбр3. Да все клево. Но как бы сделать так, чтобы я успел проинициализировать класс до обращений из польщовательского кода ? Инициализируйся при первом обращении. Или при старте программы. Или еще как. Какое это имеет отношение к архитектуре самих классов с конструкторами, непонятно. Изюбр4. Два миллиона зеленых мертвых президентов меня устроит :) С такой архитектурой, боюсь, можно рассчитывать максимум на десяток деревянных гривен ) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 12:50 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
МСУ, Инициализирует не клиентский код. А другая библиотека. Причем клиентский код об этой внешней библиотеке не знает. Причем и сам Класс_1 не знает о Классе_2. У Класса_1 есть переменная, которую кто-то должен проинициализировать извне. Класс_1 вообще не знает кто там вызовет его конструктор и передаст ему КонекшнСтринг. Т.е. о Классе_2 он вообще в принципе ничего не знает, Класс_1 это просто класс из библиотеки. Откуда ему знать имя конкретного класса, который даст ему Строку в конструктор. Опять же. Клиентский код тоже не знает о Классе_2. Потому, что я хочу Клиентский Код отделить от всей кучи технических деталей, которые тянет с собой Класс_2 и Класс_1 (внутри себя). Слишком уж это завяжет Клиентский Код на сущности, которые ему не нужны в работе. Я хочу отцепить Клиентский Код от всех этих не нужных ему сущностей. И поэтому хочу, чтобы Клиентский Код получил уже работоспособный (инициализированный) Класс_1. Который для него кто-то должен проинициализировать. Соответственно мне нужно придумать, как обеспечить, чтобы Клиентский Код получил уже проинициализированный Класс_1. Проинициализировать его может Класс_2. Который знает где добыть конфигурационные параметры. Классу_1 это безразлично. Ему лишь нужна Строка. Да я в прицнипе там планирую позаботится о правах доступа, чтобы никто, кроме Класса_2 не смог влезть - но это в принципе я уже придумал как сделать. Ну и итог. Мне нужно обеспечить, чтобы Класс_1 был проинициализирован Строкой, до любого обращения к нему от Клиентского Кода. В целом я вижу единственную возможность - это инициализация Класса_1 в его статическом конструкторе (который будет доступен только избранным - т.е. Классу_2). И (большое спасибо pation за наводку) я думаю, идея с ленивым доступом к методам Класса_1 прекрасное решение. Т.е. Класс_2 статически проинициализирует Класс_1. Клиентский Код не будет иметь доступ к Статическому конструктору, а значит будет работать с Классом_1 уже после того, как тот должен быть проинициализирован. Соответственно Клиентский Код вызовет любой метод, который, в свою очередь, будет обращаться к внутреннему свойству через get. Там я делаю проверку, что нужные данные проинициализированы, и в ином случае выдам ошибку. как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 13:17 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Изюбр, авторВ целом я вижу единственную возможность - это инициализация Класса_1 в его статическом конструкторе (который будет доступен только избранным - т.е. Классу_2). если я не ошибаюсь конструктор типа может выполниться при загрузке приложения... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:11 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
netivanИзюбр, если я не ошибаюсь конструктор типа может выполниться при загрузке приложения... Ох печаль... Тогда похоже придется думать о DI :( Чтобы Клиентский Код запрашивал Класс_1 у некоторой точки доступа, а точка доступа возвращала Класс_1, проинициализированный Классом_2 (надо будет еще обучить эту точку тому, что Класс_2 умеет инициализировать Класс_1) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:38 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
ИзюбрМСУ, Инициализирует не клиентский код. А другая библиотека. Причем клиентский код об этой внешней библиотеке не знает. Причем и сам Класс_1 не знает о Классе_2. У Класса_1 есть переменная, которую кто-то должен проинициализировать извне. Класс_1 вообще не знает кто там вызовет его конструктор и передаст ему КонекшнСтринг. Т.е. о Классе_2 он вообще в принципе ничего не знает, Класс_1 это просто класс из библиотеки. Откуда ему знать имя конкретного класса, который даст ему Строку в конструктор. Опять же. Клиентский код тоже не знает о Классе_2. Потому, что я хочу Клиентский Код отделить от всей кучи технических деталей, которые тянет с собой Класс_2 и Класс_1 (внутри себя). Слишком уж это завяжет Клиентский Код на сущности, которые ему не нужны в работе. Я хочу отцепить Клиентский Код от всех этих не нужных ему сущностей. И поэтому хочу, чтобы Клиентский Код получил уже работоспособный (инициализированный) Класс_1. Который для него кто-то должен проинициализировать. Соответственно мне нужно придумать, как обеспечить, чтобы Клиентский Код получил уже проинициализированный Класс_1. Проинициализировать его может Класс_2. Который знает где добыть конфигурационные параметры. Классу_1 это безразлично. Ему лишь нужна Строка. Да я в прицнипе там планирую позаботится о правах доступа, чтобы никто, кроме Класса_2 не смог влезть - но это в принципе я уже придумал как сделать. Ну и итог. Мне нужно обеспечить, чтобы Класс_1 был проинициализирован Строкой, до любого обращения к нему от Клиентского Кода. В целом я вижу единственную возможность - это инициализация Класса_1 в его статическом конструкторе (который будет доступен только избранным - т.е. Классу_2). И (большое спасибо pation за наводку) я думаю, идея с ленивым доступом к методам Класса_1 прекрасное решение. Т.е. Класс_2 статически проинициализирует Класс_1. Клиентский Код не будет иметь доступ к Статическому конструктору, а значит будет работать с Классом_1 уже после того, как тот должен быть проинициализирован. Соответственно Клиентский Код вызовет любой метод, который, в свою очередь, будет обращаться к внутреннему свойству через get. Там я делаю проверку, что нужные данные проинициализированы, и в ином случае выдам ошибку. как то так.Какая-то странная архитектура. Клиентский код не знает ни про библиотеку, ни про Класс_2. А кто о них знает, кто в итоге обратится к библиотеке, или к Классу_2? Класс_1? Тогда из-за чего весь сыр-бор? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:39 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Изюбр, реализуйте фабрику, что будет создавать для клиентского кода экземпляр Класса_1 и внутри себя знать о чём ей надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:40 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
skyANAИзюбр, реализуйте фабрику, что будет создавать для клиентского кода экземпляр Класса_1 и внутри себя знать о чём ей надо. Хм... А действительно. Фабрика и будет делать то, что я предпологал возложить на CLR. Т.е. при первом запросе - она увидит, что Класс_1 не инициализирован, и вызовет Класс_2 для инициализациия... В общем я правильно понял, что нужна общая точка доступа :) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:44 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
skyANAКакая-то странная архитектура. Клиентский код не знает ни про библиотеку, ни про Класс_2. А кто о них знает, кто в итоге обратится к библиотеке, или к Классу_2? Класс_1? Тогда из-за чего весь сыр-бор? Интерфейсы. Попытка все реализовать через интерфейсы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:45 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
ИзюбрskyANAКакая-то странная архитектура. Клиентский код не знает ни про библиотеку, ни про Класс_2. А кто о них знает, кто в итоге обратится к библиотеке, или к Классу_2? Класс_1? Тогда из-за чего весь сыр-бор? Интерфейсы. Попытка все реализовать через интерфейсы.Ну дык: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:48 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
ИзюбрnetivanИзюбр, подробнее про задачу. Вы на плохую дорогу становитесь :) Может действительно DI вам нужен? DI это что-то слишком сложное. Вот так вот вбухивать в проект. Ну задачу я описал. Нужно загнать в Класс_1 глобальную информацию, имеющую смысл для всех его членов. Т.е. статическую. Без этой информации он абсолютно не работоспособен (как он подключистя к БД без строки подключения ?) Соответственно что имеем: 1. глобальную информацию (статика нужна я так понимаю) 2. не работоспособность до инициализации. В принципе тут есть что-то от ленивой инициализации. Но код не многопоточен. По идее до обращения клиентского кода статическая информация уже в ПРИНЦИПЕ должна быть. В общем нет... похоже lazy тут не подходит. Естественно, лучше подобные мины закладывать на ровном месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 14:52 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
netivanесли я не ошибаюсь конструктор типа может выполниться при загрузке приложения... ЗЫ. Можно поигратся с флагом BeforeFieldInit, чтобы отключить случайный вызов. Но пожалуй Фабрика - это отличный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2013, 15:02 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Подскажите. Если реализовать методы и параметры через обобщенные типы так. Будет нормально ? Код: 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.
Нужно ли в методах WorkMethod делать какие-либо проверки ? Как посоветуете улучшить код еще ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 16:24 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Не хватает: Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 18:02 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
skyANAНе хватает: Код: c# 1. 2. 3. 4. 5. 6. 7.
ок добавлю :) А так как - сойдет ? Али чего поправить/исправить ? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 18:51 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Так же мне все тут рекомендовали сделать ? А то может чего по лучше можно.... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 18:53 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Так как код ? В частности вот это: Код: c# 1. 2. 3. 4. 5.
Или все классы правильней завязать на базовый класс ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2013, 11:29 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
Молчание ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2013, 11:27 |
|
Как обеспечить порядок выполнения двух статических конструкторов
|
|||
---|---|---|---|
#18+
ИзюбрМолчание ) Народ потихоньку переваривает информацию и тихо прифигевает Мне, например, до сих пор не совсем понятна архитектура решения... Хотя подозреваю, что речь может идти об а-ля плагинах... Ну или о каком-то виде "интерфейсов" для взаимодействия с Вашей библиотекой (программой/сервисом и т.д.), которая реализует стандартный набор функциональности и доступна сторонним вызовам... В таком случае у Вас, естественно будет описание работы с Вашим функционалом в котором, как минимум, можно указать, что перед первым боевым вызовом функций Вашего функционала, в обязательном порядке необходимо вызвать функцию такую-то, иначе будет произведена дефолтная инициализация и амбец...(дальше, как говорится, сам дурак, тебя мол, предупреждали). Либо действительно пойти по пути использования синглтон фабрики, через которую будут дёргаться методы Вашего объекта, либо фабрика будет сама создавать экземпляр объекта, инициализировать его и отдавать клиентскому коду... Архитектуру бы и задачу(не та что в сабже) распишите в общих чертах, а там подсобим... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2013, 20:08 |
|
|
start [/forum/topic.php?fid=20&msg=38143506&tid=1405086]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 337ms |
total: | 481ms |
0 / 0 |