IPackage类实现中的简单注入器依赖注入

时间:2015-12-04 20:14:32

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

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

为了进行单元测试,谓词应该可以通过参数进行配置。我试图在Package类中注入一个服务,但是我得到了“包必须有一个默认的构造函数。”异常

谢谢

2 个答案:

答案 0 :(得分:1)

不可能让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);

答案 1 :(得分: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));
}