C# 这基本上就是像NInject这样的国际奥委会所做的吗?

C# 这基本上就是像NInject这样的国际奥委会所做的吗?,c#,asp.net-mvc,nunit,inversion-of-control,ninject,C#,Asp.net Mvc,Nunit,Inversion Of Control,Ninject,通常我会这样做: public class DBFactory { public UserDAO GetUserDao() { return new UserDao(); } } 其中UserDao是IUserDao的具体实现 因此,现在我的代码将充斥着: DBFactory factory = new DBFactory(); IUserDao userDao = factory.GetUserDao

通常我会这样做:

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,我会在应用程序启动时绑定特定的实现,或者通过配置文件绑定。(或根据特定参数等进行绑定)

就这些吗?还是还有更多


(我问的原因是我想知道这对我有什么帮助:)

总之,是的。然后,代码的结构将发生变化,因此依赖项将通过构造函数(或setter,我个人并不喜欢)传递进来。对于方法体中的服务,您将不再说“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);
     }     
}

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

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