依赖于帐户id的存储库是一种很好的方法

本文关键字:一种 方法 很好 id 存储 依赖于 | 更新日期: 2023-09-27 18:12:08

我对DI/IC有点陌生,我想知道我所做的方法是否不是某种反模式,或者可能有更好的方法来做到这一点。

<<h3>场景/h3>

Api提供项目的详细信息,这些详细信息隐藏在帐户下。帐户向api授权,然后可以获得他的项目,例如/api/v1/projects/

一切都在Account下面,我不想让每个方法都像GetByAccountId()一样。或者例如,如果项目有项。GetByAccountAndProjectId()。所以我想要这个帐户一直被注入。

我的方法
public class ProjectRepository : IProjectRepository
{
    private readonly IMongoDbContext _db;
    private readonly Account _acc;
    public ProjectRepository(IMongoDbContext db, Account acc)
    {
        _db = db;
        _acc = acc;
    }
    public IQueryable<Project> GetAll()
    {
        return _db.Projects.AsQueryable().Where(x => x.AccountId == _acc.Id);
    }
}

然后像这样将Account注入到每个存储库。

kernel.Bind<IProjectRepository>().To<ProjectRepository>()
    .WithConstructorArgument("acc", x => Kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());

问题
  • 这个方法好吗?

  • 有没有更好的办法?

  • 我在依赖项注册中解析依赖项是不是很奇怪?

依赖于帐户id的存储库是一种很好的方法

我同意,我认为这很好。与其将其绑定为构造函数参数,不如将其更改为:

kernel.Bind<IProjectRepository>().To<ProjectRepository>();
kernel.Bind<Account>()
      .ToMethod(ctx => x => Kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());

这样你就不必为每个需要帐户的存储库等做了。

如果每次调用IAccountAuthorizationService.GetCurrentAccount()的Account都是相同的,您甚至可以将其性能改进为:

Lazy<Account> lazyAccount = new Lazy<Account>(
     () => kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());
kernel.Bind<Account>().ToMethod(ctx => lazyAccount.Value);
(但我只会在此分辨率的性能确实是一个关键问题时才会这样做)。