我的Mapper类应该被注入到我的控制器中,还是我可以直接实例化它

本文关键字:我的 我可以 实例化 控制器 Mapper 注入 | 更新日期: 2023-09-27 18:14:57

在我的控制器中,所有依赖项都是通过注入接收的,遵循依赖倒置原则,除了一个,Mapper类,它是由构造函数实例化的:

public class HomeController : Controller
{
    private readonly ISomeAppService SomeAppService;
    private readonly Mapper Mapper;
    public HomeController(ISomeAppService someAppService)
    {
        SomeAppService = someAppService;
        Mapper = new Mapper();
    }
    public ActionResult Index()
    {
        var someList = SomeAppService.GetSomeList();
        var someListDTO = Mapper.Map(someList);
        return View(new HomeIndexViewModel(someListDTO));
    }

SomeAppService是我的域层前面的应用层的服务。Mapper接收域对象并返回dto供视图使用。

我的理由是,因为ViewModel只表示您想要在视图/页面上显示的数据,所以我无法预见任何需要用其他东西替换Mapper的情况,或者这对测试有何不利。我也看不到这个Mapper类在任何其他表示层上被重用,因为其他视图可能与Web表示不同。对我来说,它就像是控制器的一部分。

问题是,这对吗?我需要通过依赖注入来接收Mapper吗?我需要为它定义一个接口吗?如果是这样,原因是什么?我想坚持可靠的原则,但我想知道它们是否适用于这里,以及如何适用于这里。

我的Mapper类应该被注入到我的控制器中,还是我可以直接实例化它

我个人建议注入Mapper实例。这正是IoC容器被设计来管理的。

没有理由在你的控制器中实例化它,并且在它的当前状态违反了SOLID原则的开闭原则和控制反转。

使用IoC容器注入它的好处是:

提高可测试性

通过将Mapper实例注入到控制器中,您将能够为它创建模拟以编写更好的测试。虽然你可以测试你的控制器,因为它是现在,你不能测试你的映射器实例在控制器中的任何条件。

提高可扩展性

几个月后,当你想要将构造函数参数传递给映射器时,会发生什么?您需要遍历所有控制器动作并更新构造函数。通过将创建Mapper实例的责任传递给IoC容器,您创建了单个配置点,这意味着对Mapper类的任何进一步修改或更改都可以在一个地方进行管理和配置。

对于大多数预期寿命超过几个月的软件,有一件事你可以肯定——它会变化。虽然您现在可能没有看到更改映射器实例的理由,但设计软件的方式使您能够尽可能轻松地进行更改是一个很好的实践。您必须更改的部分和部分越多,您破坏某些东西或引入错误的可能性就越大。

除了上面@JoeMighty提供的所有好处之外,我还要补充一点,通过在控制器中注入Mapper,您可以外部化Mapper。映射定义,将控制器从这个责任中解放出来。另外,您可以通过控制注入的Mapper的生命周期来缓存映射定义,这样Mapper就不必为每个请求创建定义。

相关文章: