1

通常我会这样做:

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

}

其中 UserDao 是 IUserDao 的具体实现。

所以现在我的代码会乱七八糟:

DBFactory factory = new DBFactory();

IUserDao userDao = factory.GetUserDao();

User user = userDao.GetById(1);

现在,如果我想交换实现,我将不得不去我的 DBFactory 并更改我的代码以调用不同的实现。

现在,如果我使用 NINject,我会在应用程序启动时绑定特定的实现,或者通过配置文件。(或基于特定参数等进行绑定等)。

这就是全部吗?或者还有更多?

(我问我是否想知道它在这里对我有什么帮助的原因:Help design a order manager class

4

2 回答 2

2

一句话,是的。然后,您的代码将在结构上发生变化,因此您的依赖项将通过构造函数(或设置器,我个人不喜欢)传递。您将不再在方法主体中为服务说“new XXX()”。

您也可能根本不再需要工厂,因为 DI 框架可以充当工厂。您可能只需要对 IUserDAO 的构造函数依赖。

所以像:

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

     public User MyMethod(userId)
     {
         return _userDAO.GetById(int userId);
     }     
}
于 2009-12-18T20:46:37.937 回答
1

还有更多,一个例子是如果 UserDao 的构造函数需要一些其他对象作为参数(依赖项)传递。

您可以让 ninject 自动创建和注入这些对象,节省一些代码行,但更重要的是确保每个类与其依赖项松散耦合。

于 2009-12-18T20:47:36.497 回答