根据程序集使用 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"));
我有两个不同的 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"));