以编程方式更新容器内的配置

发布于 2024-11-24 23:18:32 字数 1423 浏览 7 评论 0原文

在我的应用程序中,我询问用户他们想要连接到哪个数据库,然后我将其写回 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>();

现在我尝试在我的程序 main 中使用 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 中更新的配置?

In my app I ask the user which database they want to connect to and I was writing it back into EL5.0 like this:

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

Which was then used whenever I called GetInstance like this:

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

Now I'm trying to use Unity in my programs main class

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

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

and I use unityContainer which is a one of MainForm's dependencies instead of GetInstance():

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

But this doesn't use the updated configuration.

How do I merge the updated configuration in Unity like I did with the EL static class?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅语花开 2024-12-01 23:18:32

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

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

。 。 。然后你说 unityContainer 是 MainForm 的依赖项。

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

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

How is unityContainer getting passed into MainForm? It looks like you are resolving one container with another, since you resolve MainForm like this, after creating a new UnityContainer:

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

. . . and then you say unityContainer is a dependency of MainForm.

It looks to me like you have at least two, and possibly three different instances of the container. Can you simply use EnterpriseLibraryContainer.Current in all cases?

As an aside, in most cases you don't want to pass the container into your implementations or call Resolve() directly from your implementations. This is the Service Locator Anti-Pattern.

獨角戲 2024-12-01 23:18:32

除了 Phil 的回答(我赞同)之外,容器应始终根据 使用注册解决发布模式。这意味着一旦您开始从容器解析(和释放)实例,您就不应该修改其配置。我无法从问题中判断这是否是所要求的,但标题似乎暗示了这一点。

In addition to Phil's answer (which I second), containers should always be used according to the Register Resolve Release pattern. This implies that once you start Resolving (and Releasing) instances from the container, you should not modify its configuration. I can't really tell from the question whether that's what is being asked for, but the title seems to imply it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文