依赖于帐户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());
问题这个方法好吗?
有没有更好的办法?
我在依赖项注册中解析依赖项是不是很奇怪?
我同意,我认为这很好。与其将其绑定为构造函数参数,不如将其更改为:
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);