C# 瞬态组件注册为瞬态,但实现idisposable

C# 瞬态组件注册为瞬态,但实现idisposable,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我使用简单的注入器,但不知何故,我得到了错误,如主题中所述。在我决定发布这个问题之前,我尝试了很多事情,例如,这对我来说不起作用。我在调用验证时遇到以下异常: 验证错误消息: 配置无效。报告了以下诊断警告: -[一次性瞬态组件]AlbumsController已注册为瞬态,但实现IDisposable -[一次性瞬态组件]ArtistsController已注册为瞬态,但实现IDisposable -[一次性瞬态组件]HomeController注册为瞬态,但实现IDisposable 有关警告

我使用简单的注入器,但不知何故,我得到了错误,如主题中所述。在我决定发布这个问题之前,我尝试了很多事情,例如,这对我来说不起作用。我在调用
验证
时遇到以下异常:

验证错误消息:

配置无效。报告了以下诊断警告:

-[一次性瞬态组件]AlbumsController已注册为瞬态,但实现IDisposable

-[一次性瞬态组件]ArtistsController已注册为瞬态,但实现IDisposable

-[一次性瞬态组件]HomeController注册为瞬态,但实现IDisposable

有关警告的详细信息,请参阅Error属性。请参阅如何修复问题以及如何抑制单个警告

应用程序启动

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));
}
控制器:

注意:存储库实现了
IDisposable

public class HomeController : Controller 
{
    ...
}

public class AlbumsController : Controller 
{
    readonly IRepository<Album> _repository;

    public AlbumsController(IRepository<Album> repository)
    {
        _repository = repository;
    }

    ...
}
公共类HomeController:控制器
{
...
}
公共类相册控制器:控制器
{
只读存储库;
公共相册控制器(IRepository存储库)
{
_存储库=存储库;
}
...
}
其他详情:

  • 我的控制器不会覆盖受保护的虚拟无效处置(bool)
方法
  • 我使用的是Simple Injector v4.4.0
  • 我正在使用web集成包v3.2.7

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

    问题出现在引用的包中:

    
    
    正如您所看到的,MVC的包来自另一个主要分支

    如果您将所有内容更新为4.4.0,您的问题就会消失

    除此之外,错误消息没有告诉您在存储库中实现
    IDisposable
    。SimpleInjector和任何其他相关工具都无法为您决定这一点


    如果你需要的话,你应该自己决定。如果您还想注入
    DbContext
    ,这是最佳实践,那么假设当前的实现不会有太大变化,那么根本不需要在存储库中实现
    IDisposable

    请将堆栈跟踪作为文本发布,不是每个人都能看到链接的图像吗?@qujck粘贴了包括堆栈跟踪在内的所有信息stacktrace介绍了xxxController。关于存储库的信息是不相关的。您的HomeController等是否继承了Controller?@Ric.Net是正确的。请发布其中一个控制器的相关代码,如
    HomeController
    。最可能的原因是您的控制器类(或其基类)重写了
    控制器
    基类中的
    受保护的void Dispose(bool)
    。@Steven我为您添加了更多代码。注意,我在Repository类中实现了IDisposable,因为我认为它必须根据错误来完成。我应该删除它吗?你是说所有simpleinjector库都必须来自同一个版本?我会说是的,但至少来自同一个主要版本。您是否担心为什么不想引用web包的v4?尽管如此,我们不想知道为什么会出现这种情况。由于我从nuget安装了simpleinjector,我想知道为什么安装的版本不同,这就是我当前关注的问题。干杯,男人,天堂;我以前没注意到。我现在明白了:)经过深入分析,@Ric.Net和我发现DiagnosticType枚举在v4中发生了更改,导致其值意外地重新编号。由于C#将这些值编译为硬编码整数,v3集成包只引用了value
    6
    ,这在v4中会导致不同的抑制(即模糊的生活方式)。所以这里有两件事我做错了:1。忘记对代码库中的枚举值进行编号,2。忘记将NuGet包依赖项限制在同一主要版本。
    public class HomeController : Controller 
    {
        ...
    }
    
    public class AlbumsController : Controller 
    {
        readonly IRepository<Album> _repository;
    
        public AlbumsController(IRepository<Album> repository)
        {
            _repository = repository;
        }
    
        ...
    }