2009-01-19 2 views
2

У нас есть приложение, которое мы разрабатываем на C#. Мы храним все ресурсы в центральной DLL ресурса, ресурс содержит изображения, значки и строки, из которых мы поддерживаем несколько культур.Может ли отражения когда-либо терпеть неудачу в C#?

Мы получаем доступ к ресурсам из любого проекта в решении, используя следующий код;

private ResourceManager ResMan; 
ResMan = new ResourceManager("libResx.Resource", Assembly.ReflectionOnlyLoad("libResx")); 

Затем мы получаем доступ к любому элементу ресурса используя;

btnClose.Text = ResMan.GetString("btnClose"); 

Помимо DLL ресурса отсутствует, есть все, что может вызвать отражение потерпеть неудачу, чтобы найти DLL ресурса (сборка). Пока тестирование было безупречным, есть ли что-то, о чем мы должны знать, когда это в конечном итоге развертывается в дикой природе?

Может ли отказ отразить?

ответ

2

Посмотрите на справочную документацию для каждого из этих API, чтобы просмотреть список исключений, которые может передать каждый API.

0

К моему опыту, я обнаружил, что вместо того, чтобы в зависимости от имени сборки указать полный путь, более надежны. Вместо этого вы можете использовать Assembly.ReflectionOnlyLoadFrom.

3

Это может потерпеть неудачу. Вы можете приписать сборку для предотвращения отражения от другой сборки за пределами того же пространства имен.

1

Отражение чрезвычайно полезно, однако оно может потерпеть неудачу и по более практическим причинам.

Это произошло со мной совсем недавно в веб-приложении MVC (замок MVC, Windsor, Brail & Boo). Когда компилятор boo компилирует &, он обращается к списку из пакета свойств, он использует отражение для идентификации подписи MyModel, чтобы затем ссылаться на атрибуты для представления.

В том случае, когда отражение в этом случае не удалось, более старые записи базы данных MyModel больше не синхронизировались с новой моделью, так как старые данные имели нулевые значения для некоторых новых атрибутов или свойств MyModel. Это не проблема для новых записей, которые имели значения в новых полях атрибутов.

Как правило, я бы зарегистрировал вашу сборку в качестве зависимости и помещал пространство имен в ваше предложение использования. Это дает компилятору четкие цепи зависимостей при компиляции. Это также облегчает другим разработчикам определение того, что зависит от конкретной библиотеки, вместо того, чтобы перетаскивать кучу кода, чтобы найти скрытый вызов Assembly.Reflection.OnLoad во внешнюю dll.

Кроме того, если вы ожидаете, что ваш ResourceManager сильно изменится, вы должны подумать о том, чтобы полностью разделить его на отдельную dll самостоятельно. (В соответствии с SOLID OOP Design Priciples). Это делает ваше приложение более модульным, и если вам когда-либо понадобится обновить сборку ресурсов, вы перекомпилируете только те библиотеки, которые затронуты.

Uncle Bob - Principles of OOD (SOLID)

Смежные вопросы