【问题标题】:Simple Injector Dependency injection in a IPackage class implementationIPackage 类实现中的简单注入器依赖注入
【发布时间】:2015-12-07 20:34:02
【问题描述】:

有没有办法在 SimpleInjector.Packaging.IPackage 类实现中进行依赖注入?我正在使用装饰器注册,并且有可用的 RegisterDecorator 重载允许添加谓词来确定是否应将装饰器应用于特定的服务类型。

为了进行单元测试,谓词应该可以通过参数进行配置。我尝试在 Package 类中注入服务,但得到 "Packages must have a default constructor." 异常

谢谢

【问题讨论】:

    标签: c# dependency-injection inversion-of-control simple-injector


    【解决方案1】:

    除了@Steven 的回答(我同意),您可以创建自己的IServicePackage 接口并将配置类传递给它:

    public class CompositionRootSettings {
    
        public string Something { get; set; }
    
    }
    
    public interface IServicePackage
    {
        void RegisterServices(Container container, CompositionRootSettings settings);
    }
    
    public static void RegisterServicePackages(this Container container, CompositionRootSettings settings)
    {
        var packages = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                       from type in assembly.GetTypes()
                        where typeof(IServicePackage).IsAssignableFrom(type)
                        where !type.IsAbstract
                        select (IServicePackage)Activator.CreateInstance(type);
    
        packages.ToList().ForEach(p => p.RegisterServices(container, settings));
    }
    

    【讨论】:

      【解决方案2】:

      不可能让 Simple Injector 将依赖项注入到包中。这是故意的,这背后的理性与the container is locked at first resolve的原因相同。如链接所述,Simple Injector 可以防止这种情况,因为这是一种危险的做法,因为它可能导致各种隐藏的问题。

      Packages 库非常简单,它缺少条件注册等功能。如果这是您需要的东西,您将不得不推出自己的包实现(这实际上很简单;只需查看源代码),或者您显式注册包,如下例所示:

      if (shouldLoadPackage1) new MyPackage1().RegisterPackages(container);
      if (shouldLoadPackage2) new MyPackage2().RegisterPackages(container);
      if (shouldLoadPackage3) new MyPackage3().RegisterPackages(container);
      

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多