有条件解决的实例
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
我正在编写一个编辑器,其中一些对象依赖于某个 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