所以我决定将我的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);
答案 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;()。
我还没有做过,并且不需要做,因为我没有混合的开放式泛型和非泛型。但如果我想改造我的项目,我将来会更多地探讨这个问题。