根据程序集使用 Simple Injector 注入不同的依赖项

Injecting different dependencies with Simple Injector depending on assembly

我有两个不同的 IContext 实现在不同的程序集中(实际上它们在不同的解决方案中)。这些程序集都在一个父项目中使用。此父项目使用 SimpleInjector 进行 DI。

有没有一种方法可以根据要注入的 class 的装配位置使简单注入器 inject/register 不同的实现?

在伪软糖代码中,类似于:

// if assembly/namespace of class being injected into is MyApp.ProjectFoo;
container.Register(typeof(IContext), typeof(FooContext));

// if assembly/namespace of class being injected into is MyApp.ProjectBar;
container.Register(typeof(IContext), typeof(BarContext));

这可以使用 RegisterConditional 方法完成:

container.RegisterConditional<IContext, FooContext>(
    c => c.Consumer.ImplementationType.Assembly.Name.Contains("MyApp.ProjectFoo"));
container.RegisterConditional<IContext, BarContext>(
    c => c.Consumer.ImplementationType.Assembly.Name.Contains("MyApp.ProjectBar"));

如果程序集名称的检查是重复出现的模式,您可以将其提取到一个有用的方法中:

private static Predicate<PredicateContext> InAssembly(string assemblyName) =>
    c => c.Consumer.ImplementationType.Assembly.Name.Contains(assemblyName)

您可以按如下方式使用此方法

container.RegisterConditional<IContext, FooContext>(InAssembly("MyApp.ProjectFoo"));
container.RegisterConditional<IContext, BarContext>(InAssembly("MyApp.ProjectBar"));