0

Я использую простой инжектор с NuGet в ASP.NET MVC 5Образ жизни Несовпадение Web Запрос зависит от Transient в простом Injector

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

В global.asax

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

я показал ошибку на

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

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

IHomeRepository

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

HomeRepository

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

IUnitOfWork

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

GenericRepository

public class GenericRepository<TEntity> where TEntity : class 
    { 
     internal SchoolContext context; 
     internal DbSet<TEntity> dbSet; 

     public GenericRepository(SchoolContext context) 
     { 
      this.context = context; 
      this.dbSet = context.Set<TEntity>(); 
     } 

     public virtual IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      string includeProperties = "") 
     { 
      IQueryable<TEntity> query = dbSet; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      { 
       query = query.Include(includeProperty); 
      } 

      if (orderBy != null) 
      { 
       return orderBy(query).ToList(); 
      } 
      else 
      { 
       return query.ToList(); 
      } 
     } 

     //public IQueryable GetIQueryable() 
     //{ 
     // return context.Set<TEntity>().AsQueryable(); 
     //} 
     public IEnumerable<TEntity> Query(Expression<Func<TEntity, bool>> filter) 
     { 
      return context.Set<TEntity>().Where(filter); 
     } 
     public IEnumerable<TEntity> Query() 
     { 
      return context.Set<TEntity>(); 
     } 

     //public IQueryable Query() 
     //{ 
     // return context.Set<TEntity>(); 
     //} 
     public virtual TEntity GetByID(object id) 
     { 
      return dbSet.Find(id); 
     } 

     public virtual void Insert(TEntity entity) 
     { 
      dbSet.Add(entity); 
     } 

     public virtual void Delete(object id) 
     { 
      TEntity entityToDelete = dbSet.Find(id); 
      Delete(entityToDelete); 
     } 

     public virtual void Delete(TEntity entityToDelete) 
     { 
      if (context.Entry(entityToDelete).State == EntityState.Detached) 
      { 
       dbSet.Attach(entityToDelete); 
      } 
      dbSet.Remove(entityToDelete); 
     } 

     public virtual void Update(TEntity entityToUpdate) 
     { 
      dbSet.Attach(entityToUpdate); 
      context.Entry(entityToUpdate).State = EntityState.Modified; 
     } 
    } 

Почему проверка показывает ошибку? и нормально ли использовать Переходный период и Области на одном контейнере ????

+0

Сообщение об исключении содержит эту ссылку https://simpleinjector.org/diagnostics в документации. Вы читали эту документацию? У вас есть какие-либо вопросы после прочтения этой документации и особенно [это] (https://simpleinjector.readthedocs.io/en/latest/LifestyleMismatches.html)? – Steven

+0

Вы хотите сказать, использовать стиль гибридной жизни? Если да, то как это определить? –

ответ

1

Сообщение об исключении относится к следующей странице документации: https://simpleinjector.org/diagnostics. В документации говорится о несоответствиях образа жизни:

В целом, компоненты должны зависеть только от других компонентов, которые настроены на жизнь как минимум дольше. Другими словами, безопасно, чтобы переходный компонент зависел от одноэлементного, но не наоборот. Поскольку компоненты хранят ссылку на свои зависимости в (частных) экземплярах, эти зависимости сохраняются в живых для жизни этого компонента. Это означает, что зависимости, которые сконфигурированы с более коротким сроком службы, чем их потребители, случайно живут дольше, чем предполагалось. Это может привести ко всем ошибкам, например, трудно отладить многопоточные проблемы.

документация также предоставляет следующие предложения для исправления:

  • Изменение образа жизни компонента к образу жизни, который, как короткий или короче, чем зависимость.
  • Измените образ жизни зависимого образа жизни так долго, как дольше, чем у компонента.

Это означает, что вы должны либо сделать HomeRepository транзиторной или сделать UnitOfWork Scoped.

Изготовление UnitOfWork Области применения наиболее очевидны, как описано в this q&a.

Вы хотите сказать, использовать грим гибридного стиля жизни

Вы должны забыть о гибридных жизни. Они не дают ответа на вашу проблему.

+0

Один вопрос? Можно использовать цикл WebRequestLife или Transient Lifestyle для моего репозитория? Как я понимаю, Transient может быть потребляемой памятью в пуле приложений IIS –

+0

@syedmhamudulhasanakash: Где вы узнали, что переходный процесс может быть потребляемой памятью? Приложение ASP.NET выделяет много памяти, создание нескольких дополнительных репозиториев будет незаметно для производительности. Ваш 'HomeRepository' будет размером 20 байтов. Обычно об этом не о чем беспокоиться. – Steven

+0

Так вы предлагаете придерживаться «переходного», кстати, мне просто нравится ваш ответ. Спасибо человеку –