simpleinjector 3.0不支持RegisterManyForOpenGeneric

时间:2015-08-18 21:36:24

标签: c# simple-injector

所以我决定将我的simpleinjector版本升级到3.0,突然间我得到一条消息:

  

'SimpleInjector.Extensions.OpenGenericBatchRegistrationExtensions.RegisterManyForOpenGeneric(SimpleInjector.Container,System.Type,params System.Reflection.Assembly [])'已过时:'此扩展方法已被删除。请改用Container.Register(Type,IEnumerable)。

文档中仍然有这个方法:

http://simpleinjector.readthedocs.org/en/latest/advanced.html

所以我很好奇,有什么替代方案:

container.RegisterManyForOpenGeneric(typeof(IEventHandler<>),
                                     container.RegisterAll,
                                     typeof(IEventHandler<>).Assembly);

1 个答案:

答案 0 :(得分:7)

啊......在我挠了几个小时之后,我想出来了

container.RegisterCollection(typeof(IEventHandler<>),
                             typeof(IEventHandler<>).Assembly);

RegisterCollection也处理开放式泛型。也许这应该记录在某处。

编辑:

我在新文档中意识到,上面的代码不是RegisterManyForOpenGeneric的直接翻译。所有这一切都解决了我的编译,但它没有注册我的处理程序,我今天就检查了它。

Additional information: No registration for type

这是正确的版本:

container.Register(typeof(IEventHandler<>),
                   new[] { typeof(IEventHandler<>).Assembly });

使用RegisterCollection需要一些额外的代码更改(来自文档):

  

因为我们注册了一个集合,所以我们不能再调用container.GetInstance&gt;()。相反,可以通过IEnumerable&gt;来检索实例。构造函数参数或通过调用container.GetAllInstances&gt;()。

我还没有做过,并且不需要做,因为我没有混合的开放式泛型和非泛型。但如果我想改造我的项目,我将来会更多地探讨这个问题。