Dependency injection 有条件地解决实例

Dependency injection 有条件地解决实例,dependency-injection,dryioc,Dependency Injection,Dryioc,我正在编写一个编辑器,其中一些对象依赖于某个IFileFormat接口的实例 根据文件扩展名,实际实例是FileFormat1类或FileFormat2类的实例,两者都实现了IFileFormat接口 我想让依赖于IFileFormat的类在c-tor中获取实例: class ClientObj { public ClientObj(IFileFormat f) { ... } } 是否可以基于文件扩展名动态注册IFileFormat?(这是一个字符串值)。请注意,文件扩展名本身是根

我正在编写一个编辑器,其中一些对象依赖于某个
IFileFormat
接口的实例

根据文件扩展名,实际实例是
FileFormat1
类或
FileFormat2
类的实例,两者都实现了
IFileFormat
接口

我想让依赖于
IFileFormat
的类在c-tor中获取实例:

class ClientObj {
     public ClientObj(IFileFormat f) { ... }
}
是否可以基于文件扩展名动态注册
IFileFormat
?(这是一个字符串值)。请注意,文件扩展名本身是根据用户选择的文件名在运行时确定的


我知道我可以在
ClientObj
c-tor中注入一个工厂,它可以让我动态地确定IFileFormat,但是如果只依赖
IFileFormat
实例,那就太好了,不是某些工厂实例。

如果您的扩展实现在运行时已知,您可以通过
UseInstance(new FileExt2())
注册它们的实例

如果要预先注册所有已知扩展,但根据条件选择要注入的扩展,请执行以下操作:

container.Register(设置:setup.With(条件:req=>myCfg.FileExt==“ext1”);
//其他实现也类似
更新


您也可以在任何时候使用
IfAlreadyRegistered.Replace
选项
注册新实现。(
UseInstance
默认情况下意味着)。然后也不要忘记使用
Setup.With(asResolutionCall:true)
,原因如下

谢谢。在您的第二个示例中,myCfg意味着存在一些全局可用的实例,该实例给出了当前的“状态”。这意味着我需要全局存储该状态。我想知道是否有其他方法可以做到这一点。也许这是使用DryIoc的一些特性和一些架构的组合,例如,可能是对DryIoc说的一种方式“从现在起,将接口I1、I2解析为类C1、C2”。之后,容器将I1或I2的任何依赖注入分别解析为C1和C2。您可以随时使用IfAlreadyRegistered.Replace选项注册新实现。(默认情况下,UseInstance意味着)。然后,也不要忘记使用Setup.With(asResolutionCall:true)的原因