ConstructorwithParametersinController–MVCcodedo?privateIStudent_student;publicHomeController(IStudentstudent){_student=student;}publicinterfaceIStudent{//Somemethod}ItzBasic,但我试图从外行的角度理解上面的代码到底做了什么什么?HomeController依赖于Student,因为它将一些责任委托给Student类。一种实现方式是:publicHomeController(){privateStudent_student;publicHomeController(){_student=newStudent();}}publicclassStudent{//一些方法}但HomeController对Student类有很强的依赖性。如果你想使用Student的其他实现(例如,想在单元测试HomeController时模拟Student)怎么办?你将不得不修改Student类或HomeController类(或使用其他一些不太好的选项。)这意味着您的HomeController与Student类紧密耦合。另一种方法是您发布的代码:publicclassHomeController{privateIStudent_student;publicHomeController(IStudentstudent){_student=student;}}publicinterfaceIStudent{//一些方法}publicclassStudent:IStudent{//一些方法的实现}在这里你可以传递IStudent的任何实现,即在你的单元测试中你可以传递IStudent的模拟对象,在你的真实代码中你将传递学生类的对象。所以你的HomeController现在依赖于IStudent接口(一个抽象)而不是Student类(一个实现)。这符合OOP原则:程序针对接口,而不是实现。取决于抽象。不要依赖特定的类。此外,它现在具有软依赖性。它不再与Student类紧密耦合。它是松耦合的。现在,通常您不必担心在实例化HomeController时应该传递哪个IStudent实现。只要您向它注册正确的接口和类,这就是DepedencyInjectionContainer(在您的情况下为Unity)会处理的事情。_container.Register();因此,当需要一个新的HomeController实例时,容器会识别出需要一个IStudent实例。所以它会实例化IStudent的注册实例,并在实例化HomeController类时将其作为参数传递。另请注意,您指的是“依赖注入”(这是IoC的一种特定形式)。还有其他形式的IoC(例如回调、观察者模式等)。编辑:不要忘记阅读这篇关于DI的热门文章。通常它被称为注入类依赖项,想想一个类或者更确切地说是一个处理所有事情的GOD类(验证用户输入,与数据库协调,生成HTML输出等),所以你保留所有代码不是很好吗有一个地方,或者您可以说您使用一个类开发所有软件?答案取决于你如何组织事物,你认为,组织它所属的东西是有益的,而不是你将在上面的GOD课程中看到的问题。因此,就OOPS而言,单个类shd有更改的理由,但需要完成工作,而不是寻求服务的帮助。你的HomeController也在做同样的事情,因为它不想过度工作,它要求Student对象来处理学生。在IoC中,需要注册接口和实现接口的类。所以一旦你注册了,那么只要你有上面的签名,IoC就会自动创建一个IStudent实现类的实例,并在初始化controller的时候注入到对象中。省去了公布成员的时间和精力。在上面的示例中,您只需要一个语句,但它可以是更多的数字,并且这些可能需要更多的实例来传递给控制器??。一旦我们正确地注册了这些,IoC就会完成它的工作。事实上,我们可以决定注入成员的范围/生命周期。它可以是PerInstance/PerRequest/或Singleton。有多种IoC框架可供您使用,您可以使用哪一种。当IOC解析器构造一个新的HomeController对象时,它将通过其构造函数获取一个实现IOC容器(您注册的)提供的IStudent接口的对象。您可以在此处阅读有关构造函数注入的更多信息。以上就是C#学习教程:Controller中带参数的Constructor——MVC分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
