Mini 容器学习笔记12——组合实例
在项目中常常会遇到多个组件都实现了同一个契约接口,那么在DI容器中怎么获取实现同一个契约接口的所有组件呢。 答案是:
IEnumerable<TContract> componets = ServiceLocator.GetAll<TContract>();
上面的实现方案是目前主流的DI容器的解决方法。但是这种方法是通过服务定位器把资源拉过来的,而不是通过注入的方式推过来的,不符合DI注入传统设计规范。
那么怎么能够更优雅的解决此类问题呢,MEF率先提供了一种方案ImportMany的方式来进行注入多个组件,当然MIni容器也不甘落后也很快就赶上了。下面看看Mini容器的例子。
1. 定义契约接口
[Contract] public interface ISimpleContract { }
2. 实现该契约接口的多个组件
public class SimpleComponent : ISimpleContract { } public class SimpleComponentTwo:ISimpleContract { }
3. 创建宿主程序并测试
[TestFixture] public class ManyComponentTest:TestBase { [InjectMany] ISimpleContract[] array; [Test] public void Test() { ServiceRegistry .Register<SimpleComponent>() .Register<SimpleComponentTwo>() .Compose(this); Assert.IsNotNull(array); Assert.IsTrue(array.Count() == 2); } }
Mini 容器官方网站:
推荐资源: