【问题标题】:Programatically update a configuration within a container以编程方式更新容器内的配置
【发布时间】:2011-10-07 16:45:21
【问题描述】:

在我的应用程序中,我询问用户他们想要连接到哪个数据库,然后我将其写回 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 中合并更新的配置?

【问题讨论】:

    标签: c# dependency-injection unity-container enterprise-library enterprise-library-5


    【解决方案1】:

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

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

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

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

    顺便说一句,在大多数情况下,您不想将容器传递到您的实现中或直接从您的实现中调用 Resolve()。这是Service Locator Anti-Pattern。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在我的问题进行到一半的时候,我几乎有一个“(这是正确的吗?)”......应用程序所做的第一件事就是从配置中获取连接/登录详细信息是固定的。通过此更改,我将配置进行到一半。我发现这是不对的,但我也开始明白我还有很多错误。
      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多