我很想知道在我的项目中实例化一个新实例需要多长时间,是否有某种工具可以做到这一点?或者只是把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是否有任何意义 - 这意味着它们将在首次使用时被实例化?我一直在考虑它,因为我没有在每个请求中使用所有这些存储库,通常我只使用一个。
答案 0 :(得分:2)
我很想知道在我的项目中实例化一个新实例需要多长时间,是否有某种工具可以做到这一点?
该工具名为profiler。
或者只是在ctor之后输入日志,打印时间是否足够好?
在绝大多数情况下,类实例化(即除非在类的构造函数中有大量处理),这样的快速操作几乎没有任何意义来打扰它。
我想知道创建一个新的常规c#公共类与泛型类之间是否存在时间差异
没有显着差异。
将这些存储库设置为Lazy是否有任何意义 - 这意味着它们将在首次使用时被实例化?我一直在考虑它,因为我没有在每个请求中使用所有这些存储库,通常我只使用一个。
从绩效角度来看:这将是premature optimization。只是不要担心,除非你实例化其中的一百万。 但是,从软件设计的角度来看,确实有意义只实例化那些真正需要的存储库。你正在有效地减少问题的表面 - 在给定的时间内更少地打破和关心。
答案 1 :(得分:1)
如果您对如何使注入属性变得懒惰感兴趣 - 某些DI容器支持这种情况,例如:https://github.com/ninject/Ninject.Extensions.Factory/wiki/Lazy
您的存储库的创建成本很低。导致DbContext
费用为relatively low too:
创建上下文实例时不会发生太多事情。该 初始化大多是懒惰的,所以如果你从不使用实例, 然后你支付很少的费用来创建实例。
此外,每个请求的上下文也是一种常见做法。