有没有让仓库懒惰的意义

本文关键字:有没有 | 更新日期: 2023-09-27 18:34:24

我很想知道在我的项目中实例化一个新实例需要多长时间,有没有某种工具可以做到这一点?或者只是在打印时间足够好的 ctor 之后放置日志?

我想知道创建新的常规 c# 公共类与通用类(如 Repository(之间是否存在时间差异,以便确定是否有任何意义使其变得懒惰:

假设我有一个服务,该服务为每个请求注入了我所有应用程序存储库:

public class DataService
{
   private IRepository<Folder> _folders;
   private IRepository<Folder> _letters;
   // Gets repositories per request
   public DataService(IRepository<Folder> foldersRepo, IRepository<Letter> lettersRepo..........)
   {
       _letters = lettersRepo;
       _folders = foldersRepo;
   }
}
public IRepository<T> where T: BaseEntityObject
{
    void Add(T entity);
    void Remove(T entity);
    List<T> Get();
    T FindById(int id);
    int SaveChanges();
    void Dispose(); 
}

public abstract class EFRepository<T> : IRepository<T>
{
    protected readonly DbContext Context;
    public EFRepository(DbContext context)
    {
        Context = context;
    }
    public abstract List<T> Get();
    public void Add(T item)
    {
        Context.Set<T>().Add(item);
    }
    public void Remove(T item)
    {
        Context.Set<T>().Remove(item);
    }
    public void Update(T item)
    {
        Context.Entry(item).State = EntityState.Modified;
    }
    public void Dispose()
    {
        Context.Dispose();
    }
    public int SaveChanges()
    {
        return Context.SaveChanges();
    }
    public T FindById(int id)
    {
        return Context.Set<T>().Find(id); 
    }
}

public LettersRepository : EFRepository<Letter>
{
    public LettersRepository(DbContext context) : base(context) {}
    // Override for case includes will be needed in future
    public override List<T> Get()
    {
        return Context.Set<T>().ToList();
    }
}
public FoldersRepository : EFRepository<Folder>
{
    public FoldersRepository(DbContext context) : base(context) {}
    public override List<T> Get()
    {
        return Context.Set<T>().Include("Letters").ToList();
    }
}

将这些存储库作为 Lazy 有什么意义 - 这意味着它们将在第一次使用时被实例化?我一直在考虑这个问题,因为我不会在每个请求中使用所有这些存储库,通常我只使用一个。

有没有让仓库懒惰的意义

我很想知道在我的项目中实例化一个新实例需要多长时间,是否有某种工具可以做到这一点?

该工具称为探查器。

或者只是在打印时间足够好的 ctor 之后放置日志?

在绝大多数情况下(即,除非类的构造函数中有大量处理(,类实例化是如此快速的操作,以至于为此烦恼几乎没有任何意义。

我想知道创建新的常规 c# 公共类与泛型类之间是否存在时间差异

没有显著差异。

将这些存储库作为 Lazy 有什么意义 - 这意味着它们将在第一次使用时被实例化?我一直在考虑这个问题,因为我不会在每个请求中使用所有这些存储库,通常我只使用一个。

从性能的角度来看:这将是过早的优化。只是别担心,除非你像一百万个实例化。但是,从软件设计的角度来看,仅实例化那些真正需要的存储库确实是有意义的。您正在有效地减少问题的表面 - 在给定的时间需要打破和照顾的更少。

如果你有兴趣如何使注入的属性惰性 - 一些 DI 容器支持这一点,例如: https://github.com/ninject/Ninject.Extensions.Factory/wiki/Lazy

存储库的创建成本较低。原因DbContext成本也相对较低:

创建上下文实例时不会发生太多事情。这 初始化大多是惰性的,因此如果您从不使用实例, 然后,您只需为创建实例支付很少的成本。

此外,每个请求的上下文也是一种常见做法。