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;
    }

    ...
}

其他详情:

根据提供的演示项目,我确实能够重现该问题。

问题出在引用的包中:

<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