Ответ - как вы думаете, вам нужно будет изменить конфигурацию после развертывания?Если это так, используйте файл конфигурации.Если нет, я считаю, что делать это в коде проще.
И ответить на вопрос, который вы не задавали, - то, что вы хотите сделать, на самом деле возможно и довольно легко.Хитрость заключается в том, чтобы использовать один и тот же экземпляр контейнера для Enterprise Library и для всего остального.В своем коде запуска настройте экземпляр контейнера Unity и добавьте к нему EnterpriseLibraryCoreExtension (что вы можете сделать в config).Затем установите этот контейнер как ваш EnterpriseLibraryContainer.Current.Как только вы это сделаете, вы можете иметь тип с зависимостью от ICacheManager, и все остальное будет просто работать.
Примерно так:
В XML-конфигурации:
<unity>
<namespace name="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity" />
<assembly name="Microsoft.Practices.EnterpriseLibrary.Common" />
<container>
<extension type="EnterpriseLibraryCoreExtension" />
<register type="IMyType" mapTo="MyImplementation">
<constructor>
<param name="cacheManager" />
</constructor>
</register>
</container>
</unity>
(Вам, конечно, также понадобится ваша конфигурация entlib).
Затем при запуске вашего приложения получите такой код:
var container = new UnityContainer()
.LoadConfiguration();
EnterpriseLibraryContainer.Current = new UnityServiceLocator(container);
Оттуда все должно просто работать,EnterpriseLibraryContainer.Current будет получать объекты из вашего контейнера, а объекты, разрешенные из контейнера, будут вводить объекты entlib как любая другая зависимость.
После того, как вы пройдете этот шаг, следующий - получить все ваши объекты entlib.через DI и отбросьте явные вызовы EnterpriseLibraryContainer.Current.