Программно обновить конфигурацию в контейнере - PullRequest
1 голос
/ 18 июля 2011

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

    var builder = new ConfigurationSourceBuilder();

    builder.ConfigureData()
           .ForDatabaseNamed("UserDatabase")
             .ThatIs.ASqlDatabase()
             .WithConnectionString(sqlConnectionStringBuilder.ConnectionString)
             .AsDefault();

    var configSource = new DictionaryConfigurationSource();
    builder.UpdateConfigurationWithReplace(configSource);
    EnterpriseLibraryContainer.Current
        = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

Который затем использовался всякий раз, когда я вызывал GetInstance следующим образом:

    TestSQLConnection testSQLConnection = 
        EnterpriseLibraryContainer.Current.GetInstance<TestSQLConnection>();

Теперь я пытаюсь использовать Unity в моем классе программ.

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        IUnityContainer unityContainer = new UnityContainer().AddNewExtension<EnterpriseLibraryCoreExtension>();
        Application.Run(unityContainer.Resolve<MainForm>());
    }

и я использую unityContainer, который является одной из зависимостей MainForm вместо GetInstance ():

    TestSQLConnection testSQLConnection = unityContainer.Resolve<TestSQLConnection>(); 

Но это не использует обновленную конфигурацию.

Как объединить обновленную конфигурацию в Unity, как я это сделал со статическим классом EL?

Ответы [ 2 ]

4 голосов
/ 18 июля 2011

Каким образом unityContainer передается в MainForm?Похоже, вы решаете один контейнер с другим, так как вы решаете MainForm следующим образом, после создания нового UnityContainer:

Application.Run(unityContainer.Resolve<MainForm>());

.,,и затем вы говорите, что unityContainer является зависимостью от MainForm.

Мне кажется, у вас есть как минимум два, а возможно и три разных экземпляра контейнера.Можете ли вы просто использовать EnterpriseLibraryContainer.Current во всех случаях?

Кроме того, в большинстве случаев вы не хотите передавать контейнер в свои реализации или , вызывая Resolve () непосредственно из вашегореализации.Это анти-шаблон сервисного локатора .

2 голосов
/ 19 июля 2011

В дополнение к ответу Фила (который я второй) всегда следует использовать контейнеры в соответствии с шаблоном Register Resolve Release . Это подразумевает, что, как только вы начнете Разрешать (и Выпускать) экземпляры из контейнера, вы не должны изменять его конфигурацию . Я не могу точно сказать из вопроса, о чем идет речь, но название, по-видимому, подразумевает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...