Dependency injection (ninject) using strings, anti-pattern?
Is this code smell ?
Yes. Either create a ConfigurationRepository
or create a factory/builder (two different design patterns) which creates the different services and then register that factory/builder in the container instead.
I got an issue with this code too:
kernel.Bind<IUser>().To<User>()
.WithConstructorArgument(@"username", configuration.Username)
.WithConstructorArgument(@"password", configuration.Password);
A IoC container is primarly not used to create domain entities but to create services/repositories/controllers etc. i.e. to create the objects which control the flow in your application.
I would prefer to use ToMethod()
here:
kernel.Bind<IUser>()
.ToMethod(ctx => new User(configuration.Username, configuration.Password));
If the User
constructor has other dependencies, then I would defer to @jgauffin's answer.
You could still use ToMethod()
with Kernel
:
kernel.Bind<IUser>()
.ToMethod(ctx => new User(configuration.Username,
configuration.Password,
ctx.Kernel.Get<Foo>()));