生活方式不匹配Web请求取决于简单注入器中的瞬态

时间:2016-11-27 08:15:34

标签: c# asp.net asp.net-mvc dependency-injection simple-injector

我在asp.net mvc 5中使用带有nuget的简单注入器

"INSERT INTO `register` (data_table_id,val) VALUES ('$key','$value');

在global.asax

Install-Package SimpleInjector -Version 3.1.5
Install-Package SimpleInjector.Integration.Web.Mvc -Version 3.1.5

我在

上显示错误
 protected void Application_Start()
        {
            //removed for bravity
           // Container container = new DependencyInjectionContiner().DI();
            var container = new Container();
            container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
            container.Register<IHomeRepository, HomeRepository>(Lifestyle.Scoped);

            //For WebApi Request
           // container.Register<IWebApi, WebApi>(Lifestyle.Transient);
            container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
            ////To verify life styles of injection
            container.Verify();
            DependencyResolver.SetResolver(
                new SimpleInjectorDependencyResolver(container));
        }

IHomeRepository

The configuration is invalid. The following diagnostic warnings were reported:

-[Lifestyle Mismatch] HomeRepository (Web Request) depends on UnitOfWork (Transient).

HomeRepository

public interface IHomeRepository
    {
        void InsertDepartment(Department department, List<Student> students);
    }

IUnitOfWork

public class HomeRepository : IHomeRepository
    {
        private UnitOfWork unitOfWork;
        public HomeRepository(UnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
        }

        public void InsertDepartment(Department department, List<Student> students)
        {
            department.Students = students;
            unitOfWork.DepartmentRepository.Insert(department);
            unitOfWork.Save();
        }
}

GenericRepository

public class UnitOfWork : IDisposable
    {
        private SchoolContext context = new SchoolContext();
        private GenericRepository<Department> departmentRepository;
        private GenericRepository<Student> studentRepository;

        public GenericRepository<Department> DepartmentRepository
        {
            get
            {

                if (this.departmentRepository == null)
                {
                    this.departmentRepository = new GenericRepository<Department>(context);
                }
                return departmentRepository;
            }
        }

        public GenericRepository<Student> StudentRepository
        {
            get
            {

                if (this.studentRepository == null)
                {
                    this.studentRepository = new GenericRepository<Student>(context);
                }
                return studentRepository;
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }

为什么验证显示错误?在单个容器上使用瞬态 Scoped 是否可以????

1 个答案:

答案 0 :(得分:2)

异常消息引用以下文档页面:https://simpleinjector.org/diagnostics。该文档陈述了关于生活方式不匹配的以下内容:

  

通常,组件应仅依赖于配置为至少存活时间长的其他组件。换句话说,瞬态组件依赖于单例是安全的,而不是相反。由于组件在(私有)实例字段中存储对其依赖项的引用,因此这些依赖项在该组件的生命周期内保持活动状态。这意味着使用比其使用者更短的生命周期配置的依赖项意外地比预期更长寿命。这可能会导致各种错误,例如难以调试多线程问题。

该文档还提供了以下修复建议:

  
      
  • 将组件的生活方式改变为与依赖关系一样短或短的生活方式。
  •   
  • 将依赖的生活方式改变为生活方式的长度或长度。
  •   

这意味着你应该制作HomeRepository瞬态,或者UnitOfWork范围。

this q&a中所述,UnitOfWork Scoped是最明显的。

  

你的意思是说要使用混合生活方式

你应该忘记混合生活方式。他们没有为您的问题提供答案。