我正在尝试在Windows窗体应用程序中使用Simple Injector。不幸的是,https://simpleinjector.readthedocs.org/en/latest/windowsformsintegration.html的文档不正确或已过时。
当您实际运行该示例时,会导致以下错误:
The configuration is invalid. The following diagnostic warnings were reported:
-[Disposable Transient Component] MainView is registered as transient, but implements IDisposable.
此外,我正在构建的应用程序是一个Winforms MVP(被动视图)项目。我可以将MainView的范围更改为单例并且它可以工作。但是对于我的生活,由于这个范围问题,我无法弄清楚如何打开其他窗户。有没有人在具有多个窗口的真实世界MVP winforms应用程序中成功使用SimpleInjector?我很想知道Presenters,Forms / Views和Main入口点的配置方式以及他们的Lifestyle范围是什么。
仅供参考,我尝试过使用LifetimeScoping和ExecutionContextScoping扩展,但绝对没有任何效果。也许这只是一个PEBKAC问题。
谢谢, 埃里克
答案 0 :(得分:3)
使用container.RegisterSingleton< "对象" >();
http://simpleinjector.readthedocs.org/en/latest/lifetimes.html
答案 1 :(得分:3)
我在尝试重构的旧Winforms应用程序中遇到了类似的问题。
在我的情况下,我也相信你的表单是使用Application.Run()创建的。如果我们查看这个stackoverflow link,它会提到运行时会自动调用dispose()方法。
这意味着我们可以安全地忽略{strong>此胜利表单注册的警告,如simpleinjector docs中所述。
代码看起来像:
Registration registration = _container.GetRegistration(typeof(MainView)).Registration;
registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "Main Windows Form (MainView) will be automatically disposed by runtime as it is registered using Application.Run()");