因此,我使用ASP.NET MVC(在.NET Framework中)创建了最简单的应用程序,我想使用此示例将依赖项注入演示给初级用户。这是非常简单的代码,即使是新手也可以理解。
public interface IMovieRepository
{
MyViewModel GetDetails(string movie);
}
public class MoviesController : Controller
{
[HttpPost]
public async Task<ActionResult> Search(string movie)
{
// Confusion here! Is the below line a good place to inject dependency
IMovieRepository repository = new DBMovieRepository(); // <-- it can be DBMovieRepository or WebServiceMovieRepository or MockMovieRepository
MovieFinder finder = new MovieFinder(repository);
MyViewModel model = await finder.Find(movie);
return View(model);
}
}
public class MovieFinder
{
private IMovieRepository _repository;
public MovieFinder(IMovieRepository repository)
{
_repository = repository;
}
public async Task<MyViewModel> Find(string movie)
{
// Connect to database and return a detailed object
var myViewModelObj = _repository.GetDetails(movie);
return myViewModelObj;
}
}
public class DBMovieRepository : IMovieRepository
{
public MyViewModel GetDetails()
{
// Code for fetching data from a database
}
}
public class WebServiceMovieRepository : IMovieRepository
{
public MyViewModel GetDetails()
{
// Code for fetching data from a IMDB webservice
}
}
public class MockMovieRepository : IMovieRepository
{
public MyViewModel GetDetails()
{
// Code for returning a mock object here
}
}
我在代码中有一个内联注释,要求我对此感到困惑。是注入依赖项的好地方还是我必须将其注入MoviesController
构造函数中。如果是,那么如何将其传递给构造函数?这是一个.NET Framework 4.5应用程序,我不想通过引入DI容器来使本课程复杂化,而只想使用Pure DI向我的初学者阐明概念。
这是一个.NET Framework 4.5应用程序,我不想通过引入DI容器来使本课程复杂化,而只是想使用Pure DI向我的初学者阐明概念。
从字面上看是没有意义的。
纯DI
或Dependency Injection只是意味着使用IOC来提供对对象的依赖实例(通过构造函数或属性)。
Inversion of Control只是意味着,您无需将依赖对象创建Dependency,而是将控件转换为其他对象以提供实例。
您可以设计您的控制器以使用IOC。如果没有提供实例的内容,就不能DI。使用堆栈以最小的努力来编写DI的最轻便/半hacky的方式是编写自己的Controller Factory来检查构造函数的依赖项,并注入那些依赖项(或者只是假设它需要什么,将其传递)。 .. yikes)。
有关矿山的相关问题:My MVC Custom ControllerFactory works but could it be better?