我对DI / IC有些新意,我想知道我做的方法是不是某种反模式,或者可能有更好的方法。
Api提供有关项目的详细信息,这些详细信息隐藏在帐户下。帐户授予api授权,然后可以获得他的项目,例如/api/v1/projects/
。
一切都在帐户下面,我不想制作像GetByAccountId()
这样的方法。或者例如,如果Porject有项目。 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);
}
}
我将帐户注入每个存储库,如此。
kernel.Bind<IProjectRepository>().To<ProjectRepository>()
.WithConstructorArgument("acc", x => Kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());
这种方法有用吗?
有没有更好的方法?
我在依赖注册中解决依赖是不是很奇怪?
答案 0 :(得分:1)
我同意我认为这很好。 而不是将其绑定为构造函数参数如何将其更改为:
kernel.Bind<IProjectRepository>().To<ProjectRepository>();
kernel.Bind<Account>()
.ToMethod(ctx => x => Kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());
这样您就不必为需要帐户的每个存储库等执行此操作。
如果每次拨打IAccountAuthorizationService.GetCurrentAccount()
的帐户相同,您甚至可以将其改进为:
Lazy<Account> lazyAccount = new Lazy<Account>(
() => kernel.Get<IAccountAuthorizationService>().GetCurrentAccount());
kernel.Bind<Account>().ToMethod(ctx => lazyAccount.Value);
(但我只会这样做,如果这个决议的表现真的是一个关键问题)。