Хотя это и не является окончательным решением того, что мне нужно делать в моем приложении, я считаю, что выяснил, что не так с кодом. Или, по крайней мере, я нашел способ заставить его работать, который намекает на исходную проблему.
Я заменил тип String для TheString на собственный класс. Вот и все. Как только я это сделал, все работало нормально.
Я предполагаю, что это как-то связано с тем, что я пытался использовать ValueType (примитив) в качестве компонента. Я думаю, Касл не поддерживает это.
Итак, зная, что это так, теперь я могу перейти к выяснению, действительно ли этот подход сработает или нам нужно изменить направление.
UPDATE
Ради полноты, я решил пойти дальше и объяснить, что я сделал, чтобы решить мою проблему И удовлетворить мои требования.
Как и раньше, у меня есть доступ к моим параметрам конфигурации через службу IConfigurationService, определенную как:
<component id="ConfigurationService"
service="MyApp.IConfigurationService, MyApp"
type="MyApp.RuntimeConfigurationService, MyApp"
lifestyle="singleton"
/>
Это автоматически внедряется в мою (новую) IConnectionFactory, которая отвечает за генерацию объектов IDbConnection на основе строк подключения, определенных в файле конфигурации приложения. Завод объявлен как:
<component id="ConnectionFactory"
service="MyApp.Factories.IConnectionFactory, MyApp"
type="MyApp.Factories.DefaultConnectionFactory, MyApp"
lifestyle="singleton"
/>
Чтобы определить, какое соединение используется моим репозиторием, я объявляю каждое соединение как компонент, используя ConnectionFactory для создания каждого экземпляра:
<component id="MyDbConnection"
type="System.Data.IDbConnection,
System.Data, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
factoryId="ConnectionFactory"
factoryCreate="CreateConnection"
lifestyle="transient"
>
<parameters>
<connectionStringName>MyDB</connectionStringName>
</parameters>
</component>
Обратите внимание на полностью описанную ссылку на System.Data. Я обнаружил, что это необходимо при обращении к сборкам в GAC.
Наконец, мой репозиторий определяется как:
<component id="MyRepository"
service="MyApp.Repositories.IMyRepository, MyApp"
type="MyApp.Sql.SqlMyRepository, MyApp.Sql"
lifestyle="transient"
>
<parameters>
<connection>${MyDbConnection}</connection>
</parameters>
</component>
Теперь все разрешается правильно, и у меня нет НИКАКИХ жестко закодированных строк, скомпилированных в мой код. Нет имен строк подключения, ключей настройки приложения или чего-либо еще. Приложение полностью реконфигурируемо из файлов XML, что является требованием, которое я должен выполнить. Кроме того, другие разработчики, которые будут работать с решением, могут управлять фактическими строками соединения так, как они привыкли. Беспроигрышный.
Надеюсь, это поможет любому, кто столкнется с подобным сценарием.