#c# #reflection #.net-3.5 #assembly-loading
#c# #отражение #.net-3.5 #сборка-загрузка
Вопрос:
Я пытаюсь написать что-то вроде ObjectFactory
, который, учитывая путь сборки и имя типа в этой сборке, возвращает экземпляр того же типа с использованием отражения. Поскольку мне нужно многократно выполнять эти операции для типов в нескольких разных сборках, должен ли я использовать Assembly.LoadFrom
каждый раз, когда мне нужен новый экземпляр данного типа, или я должен вместо этого каким-то образом кэшировать результирующий Assembly
объект и делегировать метод создания типа?
Комментарии:
1. Я не знаю, достаточно ли это улучшит вашу производительность, но даже если это так, вам нужно внимательно следить за достоверностью вашего кэша, т. Е. Он Указывает на файлы сборки на диске, вы можете отслеживать эти файлы и аннулировать вашу кэшированную ссылку, если файл изменяется
Ответ №1:
Нет, вам не нужно, если не по проектным решениям. Вы можете хранить ссылку на сборку в памяти внутри некоторого объекта типа сборки.
Ответ №2:
Вызов Assembly.LoadFrom
каждый раз был бы медленным способом сделать это.
Я бы посоветовал, если вы хотите пойти по пути создания собственных фабричных классов, которые вы кэшируете Type
для классов, которые вы активируете.
Еще лучше я бы посоветовал взглянуть на инфраструктуру внедрения зависимостей. Если вы не знакомы с внедрением зависимостей (DI), см. http://en.wikipedia.org/wiki/Dependency_injection .
Большинство фреймворков, по крайней мере, предоставляют фабрики объектов, кэширование типов и автоматически разрешают зависимости конструктора. Это здорово, потому что вам не нужно заново изобретать колесо, и вы можете повторно использовать ту же методологию во всех своих приложениях, если хотите.
Если вы намеренно проходите через процесс создания фабрики объектов, я бы посоветовал вам в любом случае взглянуть на эти реализации с открытым исходным кодом, потому что они являются отличными примерами того, как хорошо работает DI.
-
Блок приложения Unity — http://unity.codeplex.com /
-
StructureMap — http://structuremap.sourceforge.net/Default.htm
-
Castlewinds или — http://www.castleproject.org/container/index.html
-
Ninject — http://ninject.org /