为什么会有这样的需求呢?resolve之前不注册的话出错是必然的啊。我还真遇到了这种用延时加载才能解决问题的情况。
为了代码的质量着想,我不想加编译条件,不想加条件,也不想改别人的代码。这是前提。
事情是这样的,代码中用到了一个公共模块,这个模块类用单件的形式进行调用,没有纳入Unity Container的管理。当我需要加测试代码时,这家伙就成了拦路虎。首先我想到了用DependencyAttribute独立出这个公共模块,然后设想当没有注入时属性时该值会为空。按部就班的加入代码测试过程很顺利,也没产生什么问题。但当我切换到真实环境中后,发现标记Dependency的属性必须要被注入,否则会产生异常。
还好Unity 提供了defer resolve的特性,使用很简单在需要解析的类型上包一层Func。不过事情没那么简单,只用Func包装的话,初始化没有问题了。但是调用的话还是会抛出异常。幸好还有二号方案,先用IEnumerable再用Func对原始类型进行封装。在注册时进行命名注册。这样的话解析时就可以根据序列的长度判断是否有该类型进行注册了。注意注册时必须命名注册,否则是不会识别为序列的。
以上。
为了代码的质量着想,我不想加编译条件,不想加条件,也不想改别人的代码。这是前提。
事情是这样的,代码中用到了一个公共模块,这个模块类用单件的形式进行调用,没有纳入Unity Container的管理。当我需要加测试代码时,这家伙就成了拦路虎。首先我想到了用DependencyAttribute独立出这个公共模块,然后设想当没有注入时属性时该值会为空。按部就班的加入代码测试过程很顺利,也没产生什么问题。但当我切换到真实环境中后,发现标记Dependency的属性必须要被注入,否则会产生异常。
还好Unity 提供了defer resolve的特性,使用很简单在需要解析的类型上包一层Func。不过事情没那么简单,只用Func包装的话,初始化没有问题了。但是调用的话还是会抛出异常。幸好还有二号方案,先用IEnumerable再用Func对原始类型进行封装。在注册时进行命名注册。这样的话解析时就可以根据序列的长度判断是否有该类型进行注册了。注意注册时必须命名注册,否则是不会识别为序列的。
以上。
本文介绍了在使用Unity容器管理依赖关系时遇到的问题及解决方案。针对无法直接管理的单例模式公共模块,在测试环境下通过DependencyAttribute实现依赖隔离。但在实际运行环境中,标记Dependency的属性必须被注入,否则会引发异常。文章详细解释了如何利用Unity容器的deferresolve特性,通过Func和IEnumerable结合使用来解决这一问题。

3048

被折叠的 条评论
为什么被折叠?



