发生这种情况的最可能原因是您在代码中的某个位置进行了以下调用:
我正在构建一个应用程序(Xamarin.Forms,PCL和iOS,如果需要的话),该应用程序始终使用Simple Injector进行依赖项注入。到目前为止,使用它非常好,并且在最近发行的Simple Injector 3中,我正在更新代码以与新API一起使用。不幸的是,我在进行一个特定的注册时遇到了一些麻烦。
以下是基本流程:
ISQLitePlatform
(Windows,iOS,Android等)以处理特定于平台的位(SQLite API,文件I / O等)然后该应用程序可以使用数据访问提供程序来打开数据库上的事务-IDataAccessProvider
接口只有一种方法NewTransaction()
,该方法返回具有通用CRUD方法的工作单元对象。 IDataAccessProvider
还实现了IDisposable
,Dispose()
方法处理清除,关闭打开的连接/事务等。
问题在于这些注册:
被注册为临时的。container.RegisterSingleton<ISQLitePlatform, SQLitePlatformIOS>(); container.RegisterSingleton<ILocalDataBootstrapper, SQLiteDataBootstrapper>(); container.RegisterSingleton<IDataAccessProvider>( () => container.GetInstance<ILocalDataBootstrapper>().DataAccessProvider);
[出于某种原因,在启动时,我得到diagnostic warning为
SQLiteDataAccessProvider
为IDisposable
,并且已注册为瞬态。我可以处理这个问题-处置是在正确的位置进行的-但令我感到困惑的是,考虑到我正在使用RegisterSingleton()
,它肯定是not
这是将RegisterSingleton()
与创建lambda而不是实例结合使用的怪癖?是虫子吗?还是我想念我应该做的事情?
我正在构建一个应用程序(Xamarin.Forms,PCL和iOS,如果需要的话),该应用程序始终使用Simple Injector进行依赖项注入。到目前为止,与最近的合作非常愉快,而且与......>
发生这种情况的最可能原因是您在代码中的某个位置进行了以下调用:
container.GetInstance<SQLiteDataAccessProvider>();
或者您有一个依赖于此具体类型而不是抽象的构造函数(在这种情况下,您也可以期望与此相关的其他警告)。
由于SQLiteDataAccessProvider
没有被注册为“本身”(仅通过IDataAccessProvider
抽象来注册,因此Simple Injector会为您解析此类型,默认情况下,Simple Injector会将其变为瞬态。
通过这样做,新的注册被添加到Simple Injector;您将能够在调试器中看到它。 IDataAccessProvider
有一个单例注册,SQLiteDataAccessProvider
有一个临时注册。
现在,由于SQLiteDataAccessProvider
有一个临时注册,Simple Injector将警告您该实例将不会自动处置。
解决方案是删除GetInstance<SQLiteDataAccessProvider>()
调用(或更改ctor参数以使用抽象),然后将其替换为对GetInstance<IDataAccessProvider>()
的调用。
发生这种情况的最可能原因是您在代码中的某个位置进行了以下调用: