IPackage class 实现中的简单注入器依赖注入
Simple Injector Dependency injection in a IPackage class implementation
有没有办法在 SimpleInjector.Packaging.IPackage class 实现中进行依赖注入?我正在使用装饰器注册,并且有可用的 RegisterDecorator 重载,它允许添加谓词以确定是否应将装饰器应用于特定服务类型。
为了进行单元测试,谓词应该可以通过参数进行配置。我试图在包 class 中注入服务,但出现 "Packages must have a default constructor." 异常
谢谢
不可能让 Simple Injector 将依赖项注入到包中。这是故意的,其背后的道理与the container is locked at first resolve的原因相同。正如 link 所描述的,Simple Injector 阻止了这种情况,因为这是一种危险的做法,因为它会导致各种隐藏的问题。
Packages 库非常简单,缺少条件注册等功能。如果这是您需要的东西,您将不得不推出自己的包实现(这实际上是微不足道的;只需查看源代码),或者您显式注册包,如下例所示:
if (shouldLoadPackage1) new MyPackage1().RegisterPackages(container);
if (shouldLoadPackage2) new MyPackage2().RegisterPackages(container);
if (shouldLoadPackage3) new MyPackage3().RegisterPackages(container);
除了@Steven 的回答(我同意)之外,您还可以创建自己的 IServicePackage
界面并将配置 class 传递给它:
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));
}
有没有办法在 SimpleInjector.Packaging.IPackage class 实现中进行依赖注入?我正在使用装饰器注册,并且有可用的 RegisterDecorator 重载,它允许添加谓词以确定是否应将装饰器应用于特定服务类型。
为了进行单元测试,谓词应该可以通过参数进行配置。我试图在包 class 中注入服务,但出现 "Packages must have a default constructor." 异常
谢谢
不可能让 Simple Injector 将依赖项注入到包中。这是故意的,其背后的道理与the container is locked at first resolve的原因相同。正如 link 所描述的,Simple Injector 阻止了这种情况,因为这是一种危险的做法,因为它会导致各种隐藏的问题。
Packages 库非常简单,缺少条件注册等功能。如果这是您需要的东西,您将不得不推出自己的包实现(这实际上是微不足道的;只需查看源代码),或者您显式注册包,如下例所示:
if (shouldLoadPackage1) new MyPackage1().RegisterPackages(container);
if (shouldLoadPackage2) new MyPackage2().RegisterPackages(container);
if (shouldLoadPackage3) new MyPackage3().RegisterPackages(container);
除了@Steven 的回答(我同意)之外,您还可以创建自己的 IServicePackage
界面并将配置 class 传递给它:
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));
}