Search code examples
c#dependency-injectionioc-containerninjectninject-2

How to configure Ninject so that it would inject right instance depending on previously injected instance


I can't find right words for my question so i will let my code speak instead.

I have Repository:

class Repository
{
    public Repository(DbContext ctx)
    {

    }
}

then i have this bindings:

Bind<IRepository>().To<Repository>();
Bind<DbContext>().To<UserStoreContext>().When...
Bind<DbContext>().To<CentralStoreContext>().When...

and then i have class that needs to access both db's

class Foo
{
    public Repository(IRepository userRepo, [CentralStoreAttribute]IRepository centralRepo)
    {

    }
}

How should i configure two DbContext bindings so that repositories with right contexts (based on CentralStoreAttribute) would be injected into Foo constructor?


Solution

  • Rather than relying on attributes in the right places, I usually create several types that are effectively just aliases. This is useful since with Ninject (and presumably other IoC containers) we're asking for dependencies by their type-name.

    So if you need to be able to "request" a user repository vs a central one, I would create types that alias it like this:

    interface IRepository {  /* methods and properties */ }
    interface IUserRepository : IRepository {}
    interface ICentralRepository : IRepository {}
    
    class Foo
    {
       public Foo(IUserRepository userRepo, ICentralRepository centralRepo)
       {
          // assign to fields
       }
    }
    

    I prefer this because then Ninject doesn't bleed into my app at all, it's more declarative, and I think it's simpler to remember than any convention based attribute approach like the one you're trying.