2009-12-18 10 views
1

Normalement, je ferais ceci:Est-ce fondamentalement ce que fait un IOC comme NInject?

public class DBFactory 
{ 
     public UserDAO GetUserDao() 
     { 
       return new UserDao();  
     } 

} 

Où UserDao étant la mise en œuvre concrète de IUserDao.

Alors maintenant, mon code sera jonché:

DBFactory factory = new DBFactory(); 

IUserDao userDao = factory.GetUserDao(); 

User user = userDao.GetById(1); 

Maintenant, si je voulais échanger implementaitons, je dois aller à mon DBFactory et changer mon code pour appeler une implémentation différente.

Maintenant, si j'utilisais NINject, je lierais l'implémentation spécifique au démarrage de l'application, ou via un fichier de configuration. (ou lier en fonction de paramètres spécifiques etc. etc.).

Est-ce tout ce qu'il y a aussi? Ou est-il plus?

(raison pour laquelle je demande si je veux savoir comment il va me aider: Help designing a order manager class)

Répondre

2

En un mot, oui. Votre code changerait alors dans la structure, ainsi vos dépendances seraient passées dedans par l'intermédiaire du constructeur (ou des setters, dont je ne suis personnellement pas un fan). Vous ne diriez plus "new XXX()" pour les services dans le corps de vos méthodes.

Vous n'auriez probablement plus besoin de l'usine, puisque le cadre DI peut fonctionner comme une usine. Vous auriez probablement juste besoin d'une dépendance de constructeur sur IUserDAO.

donc quelque chose comme:

public class ClassThatNeedsUserDAO 
{ 
    private readonly IUserDAO _userDAO; 
    public ClassThatNeedsUserDAO(IUserDAO userDAO) 
    { 
     _userDAO = userDAO; 
    } 

    public User MyMethod(userId) 
    { 
     return _userDAO.GetById(int userId); 
    }  
} 
+0

Lier (). () ferait tout fonctionner. – LukLed

1

Il y a plus à lui, un exemple serait si le constructeur de UserDao requis d'autres objets à transmettre comme arguments (dépendances).

Vous pouvez faire en sorte que Ninject crée et injecte automatiquement ces objets, en sauvegardant certaines lignes de code mais surtout en s'assurant que chaque classe est faiblement couplée à ses dépendances.