gpt4 book ai didi

configuration - 如何将配置参数传递给 SimpleInjector 打包?

转载 作者:行者123 更新时间:2023-12-05 01:03:10 27 4
gpt4 key购买 nike

所以 SimpleInjector 现在有一个包装 nuget,您可以使用它来隔离根组合的不同方面。

假设我在一个库中有一个可配置的组合根,它被应用程序中的多个项目重用。例如,在 Azure 解决方案中,我可能有一个 Web 角色和一个 Worker 角色,它们在大多数情况下共享大量相同的依赖项,但配置选项略有不同,具体取决于使用者。当我编写根时,我可以传入一个普通的旧 RootCompositionSettings具有告诉 SimpleInjector 如何注册依赖项的属性的对象。

但是,我不确定如何(或是否)可以将这些设置传递给 IPackage实例。是否可以将自定义设置传递给 SimpleInjector 包,如果可以,如何?

我看到注册包的标准做法是调用

container.RegisterPackages(); // scans all loaded assemblies for IPackage
// or
container.RegisterPackages(IEnumerable<Assembly>) // specific assemblies only

...那么我们如何将参数传递给包装实例?有没有办法通过容器做到这一点?

最佳答案

这里的技巧是将容器上的信息传递给包。您可以通过使用容器的 Items 来做到这一点。字典,这很像 ASP.NET 的 HttpContext.Items收藏。这可以按如下方式完成:

using SimpleInjector.Advanced;

container.SetItem(typeof(RootCompositionSettings), settings);

container.RegisterPackages();

现在在您的包中,您可以执行以下操作:

变量设置 =
(RootCompositionSettings)container.GetItem(typeof(RootCompositionSettings));

请注意:
  • SetItemGetItem是位于 SimpleInjector.Advanced 中的扩展方法命名空间。这些方法允许您访问(内部)Items字典。
  • 你可以传入任何你喜欢的键。传入typeof(RootCompositionSettings)在这种情况下只是方便,但不是必需的。

  • 如果您需要在更多位置调用设置,则创建一个更具体的扩展方法可能会很有用,该方法允许您访问设置实例,但这取决于您。

    另一种选择是不使用 IPackage接口(interface)和 SimpleInjector.Packaging 库。在大多数情况下,它并没有真正添加任何东西,您可以简单地在程序集中定义一个与包相同的公共(public)静态方法。例如:

    public static class BusinessLayerBootstrapper
    {
    public static void Bootstrap(Container container, ScopedLifestyle scopedLifestyle,
    RootCompositionSettings settings)
    {
    // Here the same logic as what you would write in your package.
    }
    }

    大多数应用程序不是动态加载程序集所需的,并且启动项目通常具有对所有其他程序集的硬引用。在这种情况下,简单地调用静态方法是完全明智的。

    即使您需要动态加载程序集并允许它们在容器中注册自己的东西,构建自己的 IPackage 也很简单。抽象代替:\

    // Your own IPackage interface
    public interface IPackage
    {
    void RegisterServices(Container container, RootCompositionSettings settings);
    }

    // Your own extension method
    public static void RegisterPackages(this Container container,
    RootCompositionSettings settings)
    {
    var packages =
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetExportedTypes()
    where typeof(IPackage).IsAssignableFrom(type)
    where !type.IsAbstract
    select (IPackage)Activator.CreateInstance(type);

    packages.ToList().ForEach(p => p.RegisterServices(container, settings));
    }

    事实上,除了一些额外的验证和过滤掉动态程序集之外,SimpleInjector.Packaging 项目也不过如此。

    关于configuration - 如何将配置参数传递给 SimpleInjector 打包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107790/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com