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

标签 configuration settings inversion-of-control packaging simple-injector

所以 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/

    相关文章:

    configuration - 面向 Internet 的 Windows Server 2008——它安全吗?

    excel - 在 Excel Desktop 中创建和设置时,Office.Settings 无法在 Excel Online 中检索

    macos - 如何使用 Dropbox 同步我的 Sublime Text 3 设置?

    Angular 2 可注入(inject)接口(interface)?

    asp.net-mvc - Asp.net Mvc : Ninject - IPrincipal

    c# - CS0122 : 'System.Configuration.StringUtil' is inaccessible due to its protection level

    php - 如何在 Laravel 5 中使用 Omnipay?

    javascript - Angular JS 自定义分隔符

    android - 以编程方式激活阻塞模式

    asp.net-mvc-3 - MVC 3 : Injecting multiple repositories into a single controller