【问题标题】:Is there a point to make repository lazy?有没有必要让存储库变得懒惰?
【发布时间】:2016-02-12 12:07:47
【问题描述】:

我很想知道在我的项目中实例化一个新实例需要多长时间,是否有某种工具可以做到这一点?或者只是将日志放在打印时间的 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 是否有任何意义——这意味着它们将在第一次使用时被实例化?我一直在考虑这个问题,因为我不会在每次请求时都使用所有这些存储库,通常我只使用一个。

【问题讨论】:

  • 您将通过一个网络与一个数据库通信。与实际执行查询和获取结果所需的时间相比,您为使类实例化速度加快任何纳秒而进行的任何优化不会有任何重大改进

标签: c# entity-framework lazy-evaluation lazy-initialization


【解决方案1】:

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

该工具称为profiler

或者只是将日志放在打印时间的 ctor 之后就足够了?

在绝大多数情况下(即除非在类的构造函数中进行繁重的处理),类实例化是一个如此快速的操作,几乎没有任何意义。

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

没有显着差异。

将这些存储库设为 Lazy 是否有任何意义——这意味着它们将在第一次使用时被实例化?我一直在考虑这个问题,因为我不会在每次请求时都使用所有这些存储库,通常我只使用一个。

从性能的角度来看:这将是premature optimization。不用担心,除非您要实例化其中的一百万个。 然而,从软件设计的角度来看,只实例化那些真正需要的存储库是有意义的。您正在有效地减少问题的表面——在给定的时间里,需要解决和关心的事情更少了。

【讨论】:

    【解决方案2】:

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

    您的存储库的创建成本很低。因为DbContext 成本是relatively low too

    在创建上下文实例时不会发生太多事情。这 初始化大多是惰性的,所以如果你从不使用实例, 那么您创建实例所需的成本非常低。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2013-02-22
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多