我有两个不同的IContext
实现,它们存在于不同的程序集中(实际上它们位于不同的解决方案中)。这些程序集都在单个父项目中使用。这个父项目使用SimpleInjector进行DI。
有没有办法让Simple Injector根据注入的类的程序集位置注入/注册不同的实现?。
在伪软糖代码中,类似于:
// 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));
答案 0 :(得分:3)
可以使用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"));