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>());
    }

我使用 UnityContainer,它是 MainForm 的依赖项之一,而不是 GetInstance():

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

但这不使用更新的配置。

如何像使用 EL 静态类一样在 Unity 中合并更新的配置?

4

2 回答 2

4

unityContainer 是如何传入 MainForm 的?看起来您正在用另一个容器解析一个容器,因为您在创建一个新的 UnityContainer 之后像这样解析 MainForm:

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

. . . 然后你说 unityContainer 是 MainForm 的一个依赖。

在我看来,您至少有两个,可能是三个不同的容器实例。您可以在所有情况下都简单地使用 EnterpriseLibraryContainer.Current 吗?

顺便说一句,在大多数情况下,您不想将容器传递到您的实现中直接从您的实现中调用 Resolve()。这是服务定位器反模式

于 2011-07-18T18:17:45.817 回答
2

除了 Phil 的回答(我第二个),容器应该始终根据Register Resolve Release 模式使用。这意味着一旦从容器开始解析(和释放)实例,就不应修改其配置。我无法从这个问题中真正看出这是否是所要求的,但标题似乎暗示了这一点。

于 2011-07-18T22:08:01.053 回答