Transient 组件注册为 transient 但实现了 idisposable
Transient component is registered as transient but implements idisposable
我使用 Simple injector 但不知何故我收到了主题中所述的错误。在我决定 post 这个问题之前,我尝试了很多事情,例如这对我不起作用。当我调用 Validate
:
时出现以下异常
验证错误信息:
The configuration is invalid. The following diagnostic warnings were reported:
-[Disposable Transient Component] AlbumsController is registered as transient, but implements IDisposable.
-[Disposable Transient Component] ArtistsController is registered as transient, but implements IDisposable.
-[Disposable Transient Component] HomeController is registered as transient, but implements IDisposable.
See the Error property for detailed information about the warnings. Please see https://simpleinjector.org/diagnostics how to fix problems and how to suppress individual warnings.
Application_Start
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
我尝试将 Lifestyle.Scoped
添加到我的注册中,如下所示:
container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);
控制器:
注意:存储库实现 IDisposable
。
public class HomeController : Controller
{
...
}
public class AlbumsController : Controller
{
readonly IRepository<Album> _repository;
public AlbumsController(IRepository<Album> repository)
{
_repository = repository;
}
...
}
其他详情:
- 我的控制器不会覆盖
protected virtual void Dispose(bool)
方法。
- 我正在使用 Simple Injector v4.4.0
- 我正在使用网络集成包 v3.2.7
根据提供的演示项目,我确实能够重现该问题。
问题出在引用的包中:
<package id="SimpleInjector" version="4.4.0" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web" version="3.2.7" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web.Mvc" version="3.2.7" targetFramework="net46" />
如您所见,MVC 的包来自另一个主要分支。
如果您将所有内容更新到 4.4.0,您的问题就会消失。
除此之外,错误消息是 而不是 告诉您在您的存储库中实施 IDisposable
。 SimpleInjector 以及与此相关的任何其他工具无法为您决定。
您应该自己决定是否需要。如果您还要注入 DbContext
,这无论如何都是最佳实践,假设当前的实现不会有太大变化,则根本不需要在您的存储库中实现 IDisposable
。
我使用 Simple injector 但不知何故我收到了主题中所述的错误。在我决定 post 这个问题之前,我尝试了很多事情,例如这对我不起作用。当我调用 Validate
:
验证错误信息:
The configuration is invalid. The following diagnostic warnings were reported:
-[Disposable Transient Component] AlbumsController is registered as transient, but implements IDisposable.
-[Disposable Transient Component] ArtistsController is registered as transient, but implements IDisposable.
-[Disposable Transient Component] HomeController is registered as transient, but implements IDisposable.
See the Error property for detailed information about the warnings. Please see https://simpleinjector.org/diagnostics how to fix problems and how to suppress individual warnings.
Application_Start
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
我尝试将 Lifestyle.Scoped
添加到我的注册中,如下所示:
container.Register<IRepository<Artist>, ArtistRepository>(Lifestyle.Scoped);
container.Register<IRepository<Album>, AlbumRepository>(Lifestyle.Scoped);
控制器:
注意:存储库实现 IDisposable
。
public class HomeController : Controller
{
...
}
public class AlbumsController : Controller
{
readonly IRepository<Album> _repository;
public AlbumsController(IRepository<Album> repository)
{
_repository = repository;
}
...
}
其他详情:
- 我的控制器不会覆盖
protected virtual void Dispose(bool)
方法。 - 我正在使用 Simple Injector v4.4.0
- 我正在使用网络集成包 v3.2.7
根据提供的演示项目,我确实能够重现该问题。
问题出在引用的包中:
<package id="SimpleInjector" version="4.4.0" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web" version="3.2.7" targetFramework="net46" />
<package id="SimpleInjector.Integration.Web.Mvc" version="3.2.7" targetFramework="net46" />
如您所见,MVC 的包来自另一个主要分支。
如果您将所有内容更新到 4.4.0,您的问题就会消失。
除此之外,错误消息是 而不是 告诉您在您的存储库中实施 IDisposable
。 SimpleInjector 以及与此相关的任何其他工具无法为您决定。
您应该自己决定是否需要。如果您还要注入 DbContext
,这无论如何都是最佳实践,假设当前的实现不会有太大变化,则根本不需要在您的存储库中实现 IDisposable
。