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自动创建和注入这些对象,从而节省一些代码行,但更重要的是确保每个类都与其依赖项松散耦合