依赖于帐户ID的存储库 - 这是一种好方法吗?

时间:2014-07-09 20:19:36

标签: c# asp.net dependency-injection ninject

我对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());

问题

  • 这种方法有用吗?

  • 有没有更好的方法?

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

1 个答案:

答案 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);

(但我只会这样做,如果这个决议的表现真的是一个关键问题)。