Загрузка сборки, создание типов и кэширование

#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.