1

私のアプリでは、接続したいデータベースをユーザーに尋ね、次のように 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>());
    }

GetInstance() の代わりに MainForm の依存関係の 1 つである unityContainer を使用します。

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

ただし、これは更新された構成を使用しません。

EL 静的クラスで行ったように、Unity で更新された構成をマージするにはどうすればよいですか?

4

2 に答える 2

4

unityContainer はどのように MainForm に渡されますか? 新しい UnityContainer を作成した後、MainForm を次のように解決するため、あるコンテナーを別のコンテナーで解決しているように見えます。

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

. . . そして、unityContainer は MainForm の依存関係であると言います。

コンテナのインスタンスが少なくとも 2 つ、場合によっては 3 つあるように見えます。すべての場合に EnterpriseLibraryContainer.Current を使用できますか?

余談ですが、ほとんどの場合、コンテナを実装に渡したり、実装から直接 Resolve() を呼び出したりすることは望ましくありません。これがService Locator Anti-Patternです。

于 2011-07-18T18:17:45.817 に答える
2

Phil の回答 (私は 2 番目) に加えて、コンテナーは常にRegister Resolve Release patternに従って使用する必要があります。これは、コンテナーからインスタンスの解決 (および解放) を開始したら、その構成を変更してはならないことを意味します。それが求められているのかどうかは、質問からはよくわかりませんが、タイトルはそれを暗示しているようです。

于 2011-07-18T22:08:01.053 に答える