在没有任何DI容器的情况下,在ASP.NET MVC应用程序中是否有很好的方法来实现依赖项注入?

问题描述 投票:0回答:1

因此,我使用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向我的初学者阐明概念。

c# asp.net-mvc
1个回答
4
投票

这是一个.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?

© www.soinside.com 2019 - 2024. All rights reserved.