一般来讲,依赖注入容器是通过在配置中提供实现类到接口的映射关系来实现注入的。而这些配置则能够很容易地在运行时根据需要进行调整或改变。例如,有时为了方便单元测试,我们可能需要改用 Mock 对象。对于这种情况,Pablo 给出了解决方案:
这简直是小菜一碟——(对于依赖注入容器)我们所要做的只是调整一下映射规则,否则容器无法知晓应该创建哪种对象的实例。现在就让我们通过一种可扩展的方法尝试配置该 WCF 服务。我们都知道,WCF 支持一个名为 IInstanceProvider 的扩展,用来控制 WCF 实例的生命周期。我们正是要通过它来加载新的代码,并在运行时将层与层之间的依赖关系注入。 <span>public</span> <span>class</span> DIInstanceProvider : IInstanceProvider { <span><br></br> [...]</span> <p><span>public</span> <span>object</span> GetInstance(InstanceContext instanceContext, Message message) {</p><br></br> DependencyContainer container = <span>new</span> DependencyContainer(); <br></br><span>foreach</span> (TypeMapping typeMapping <span>in</span> <span>this</span>.typeMappings) {<br></br> container.RegisterTypeMapping(typeMapping.TypeRequested, typeMapping.TypeToBuild); <br></br> } <span><br></br> return</span> container.Get(<span>this</span>.serviceType); <br></br> }<br></br> [...] <br></br>}
随后,该 DIInstanceProvider 将通过一个 IServiceBehavior 在运行时接入到分配程序中。类型的映射是通过一个新的 WCF 配置节实现的,该配置节可以通过 BehaviorExtensionElement 从配置文件中读取,并传递给 DIServiceBehavior 实例。在 Pablo 给出的示例中,配置文件如下所示:
<add name=“DataAccess” typeRequested=“SampleService.ICustomerDataAccess, SampleService”
typeToBuild=“SampleService.CustomerDataAccess, SampleService”/>
<add name=“BusinessComponent” typeRequested=“SampleService.ICustomerBusinessComponent, SampleService”
typeToBuild=“SampleService.CustomerBusinessComponent, SampleService”/>
typeMappings>
dependencyInjection>
behavior>
serviceBehaviors>
behaviors>
评论