I’ve been reading about DI and best practices, and still haven’t found the answer to this question. When should I use interfaces?
- Some developers suggest to add interface for every object that is being injected. This would make a modular application.
- Some other are against this.
So my question is which one is correct?
EDIT:
Below are the two sides, I still don’t see the advantage of using interfaces. In both cases I can easily mock classes, and change the implementations
Using interfaces
bind(IUserStorage.class).to(UserStorage.class);
// Unit test
bind(IUserStorage.class).to(Mock(UserStorage.class));
Not using interfaces
bind(UserStorage.class).to(UserStorage.class);
// Unit test
bind(UserStorage.class).to(Mock(UserStorage.class));
I can’t believe using interfaces is againt OOP principles!
I would definitely use interfaces in this scenario. It means you’re loosely coupling your components and can easy mock and/or substitute alternatives. Lots of DI frameworks will use the interfaces in order to provide additional functionality (e.g. create proxy objects mapped to the real objects, but with additional features).
As such I would try and use interfaces for all but the most trivial of injected objects. At some stage you’re going to want to make use of substitutability, framework code generation etc. and retrofitting interface usage is an additional pain that it’s easy to avoid at the beginning of a project.