SimpleInjector生命周期不匹配错误:注册IFileWriter集合失败求助
生命周期不匹配问题求助与解决
我尝试注册IFileWriter的实现集合,但每次都会收到错误提示:
-[Lifestyle Mismatch] ReportFileWriter (Singleton) depends on IFileWriter[] (Transient).
试过以下几种方式都没解决,求帮忙:
尝试过的方案
第一次尝试
container.Register<IReportFileWriter, ReportFileWriter>(Lifestyle.Singleton); var fileWriters = new List<Type>() { typeof(CsvFileWriter), typeof(XlsFileWriter) }; container.Collection.Register<IFileWriter>(fileWriters, Lifestyle.Singleton);
第二次尝试
container.Register<IReportFileWriter, ReportFileWriter>(Lifestyle.Singleton); var fileWriters = new List<Type>() { typeof(CsvFileWriter), typeof(XlsFileWriter) }; container.Collection.Register<IFileWriter>(fileWriters.Select(s=>Lifestyle.Singleton.CreateRegistration(s, container)));
第三次尝试
container.Register<IReportFileWriter, ReportFileWriter>(Lifestyle.Singleton); container.Register<CsvFileWriter>(Lifestyle.Singleton); container.Register<XlsFileWriter>(Lifestyle.Singleton); var fileWriters = new List<Type>() { typeof(CsvFileWriter), typeof(XlsFileWriter) }; container.Collection.Register<IFileWriter>(fileWriters, Lifestyle.Singleton);
问题原因与解决方案
这个错误的核心是:单例的ReportFileWriter依赖了瞬时(Transient)的IFileWriter[]集合——即使你已经把集合里的每个IFileWriter实现注册成单例,集合本身的生命周期默认还是瞬时的,这就导致了生命周期不匹配。
你可以通过以下两种方式解决:
方案一:注册集合时指定生命周期为Singleton
直接在集合注册时明确指定生命周期,确保集合本身是单例:
container.Register<IReportFileWriter, ReportFileWriter>(Lifestyle.Singleton); // 先注册每个IFileWriter实现为单例 container.Register<CsvFileWriter>(Lifestyle.Singleton); container.Register<XlsFileWriter>(Lifestyle.Singleton); // 注册集合,同时指定集合的生命周期为Singleton container.Collection.Register<IFileWriter>( new[] { typeof(CsvFileWriter), typeof(XlsFileWriter) }, Lifestyle.Singleton);
方案二:手动创建集合并注册为单例
如果上面的方式不生效,还可以手动创建集合实例,再将整个集合注册为单例:
container.Register<IReportFileWriter, ReportFileWriter>(Lifestyle.Singleton); // 先注册每个实现为单例 container.Register<CsvFileWriter>(Lifestyle.Singleton); container.Register<XlsFileWriter>(Lifestyle.Singleton); // 手动获取实例并创建集合 var writers = new IFileWriter[] { container.GetInstance<CsvFileWriter>(), container.GetInstance<XlsFileWriter>() }; // 将集合注册为单例 container.RegisterSingleton<IEnumerable<IFileWriter>>(writers);
这两种方式都能确保ReportFileWriter依赖的集合是单例生命周期,和自身的Singleton匹配,解决生命周期不匹配的问题。
内容的提问来源于stack exchange,提问作者Pimpy
相关产品推荐
相关产品推荐

