即使使用`RegisterSingleton()`,简单的注入器3也会将注册视为瞬态。>

问题描述 投票:4回答:1

我正在构建一个应用程序(Xamarin.Forms,PCL和iOS,如果需要的话),该应用程序始终使用Simple Injector进行依赖项注入。到目前为止,使用它非常好,并且在最近发行的Simple Injector 3中,我正在更新代码以与新API一起使用。不幸的是,我在进行一个特定的注册时遇到了一些麻烦。

以下是基本流程:

  • 注册ISQLitePlatform(Windows,iOS,Android等)以处理特定于平台的位(SQLite API,文件I / O等)
  • 注册一个引导程序,它将负责创建数据库文件,设置所有表/类型映射等。
  • 注册一个lambda,它将创建我们的数据访问提供程序,使用引导程序来设置数据库,并返回访问提供程序
  • 然后该应用程序可以使用数据访问提供程序来打开数据库上的事务-IDataAccessProvider接口只有一种方法NewTransaction(),该方法返回具有通用CRUD方法的工作单元对象。 IDataAccessProvider还实现了IDisposableDispose()方法处理清除,关闭打开的连接/事务等。

问题在于这些注册:

container.RegisterSingleton<ISQLitePlatform, SQLitePlatformIOS>();
container.RegisterSingleton<ILocalDataBootstrapper, SQLiteDataBootstrapper>();
container.RegisterSingleton<IDataAccessProvider>(
    () => container.GetInstance<ILocalDataBootstrapper>().DataAccessProvider);

[出于某种原因,在启动时,我得到diagnostic warningSQLiteDataAccessProviderIDisposable,并且已注册为瞬态。我可以处理这个问题-处置是在正确的位置进行的-但令我感到困惑的是,考虑到我正在使用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>()的调用。

c# lifecycle simple-injector
1个回答
4
投票

发生这种情况的最可能原因是您在代码中的某个位置进行了以下调用:

© www.soinside.com 2019 - 2024. All rights reserved.