有条件解决的实例

Instances resolved conditionally

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

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

我想要 classes 这取决于 IFileFormat 在 c-tor 中获取实例:

class ClientObj {
     public ClientObj(IFileFormat f) { ... }
}

是否可以根据文件扩展名以某种方式动态注册 IFileFormat? (这是一个字符串值)。请注意,文件扩展名本身是在 运行 时根据用户选择的文件的文件名确定的。

我知道我可以在 ClientObj c-tor 中注入一个工厂,它可以让我动态地确定 IFileFormat,但是以某种方式仅依赖于 IFileFormat 实例,而不是一些工厂实例。

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

注册它们的实例

如果您想预先注册所有已知的扩展,但 select 根据条件注入的扩展,则执行:

container.Register<IFileExt, FileExt1>(setup: Setup.With(condition: req => myCfg.FileExt == "ext1"));
// similar for the rest of implementations

更新

您也可以随时使用 IfAlreadyRegistered.Replace 选项 Register 新实现。 (UseInstance 表示默认情况下)。然后也不要忘记使用 Setup.With(asResolutionCall: true) 原因 https://github.com/dadhi/DryIoc/blob/master/docs/DryIoc.Docs/RulesAndDefaultConventions.md#injecting-dependency-asresolutioncall