ASP.NET MVC 5中方法位置的标准是什么

时间:2015-07-27 17:34:07

标签: c# asp.net asp.net-mvc

我有一个MVC应用程序。我在围栏上。我有一系列方法调用外部库,实例化一个类,并调用方法(当前在控制器中为每个视图定义)。

我在多个控制器中重用这些方法。

我想确保此应用程序在未来保持松散耦合。

我的问题是那些了解MVC的人,MVC的公认标准是什么?

我看到三个选项:

  1. 创建一个包含方法的类,并在每个控制器中实例化这些方法。这样我在各个控制器和库之间就有了一些东西。

    1. 将方法添加到类继承的模型中,并从类中调用方法。但是,然后我的所有控制器都会与模型紧密耦合。

    2. 直接在每个控制器中添加库中的方法。我会紧紧地耦合到图书馆,但每个控制器都有它自己的私人方法。

2 个答案:

答案 0 :(得分:2)

这里的细节很模糊,所以我无法详细说明。我认为应该确定结构的是库是否有助于业务逻辑或控制器逻辑,因为它应该在它应该被合并的地方变得简单。

business logic:类包装器与您的模型

结合使用

controller logic:类包装器(或BaseController或类似的)与您的控制器逻辑

结合使用

我确实倾向于同意尽可能将外部库分开是很好的。

答案 1 :(得分:1)

这是一个很大的话题。但通常你应该为dependency injection进行设置。

您的外部库将公开某些方法。您应该将该外部库视为可以随时换出。因此,通常的做法是编写一个接口来定义外部库应该执行的所有操作,并且控制器应了解该接口。这使控制器无需了解它不需要知道的外部接口的详细信息,从而防止它们紧密耦合。

这有几个好处:

  • 可以快速更换组件,使您的网站更加模块化
  • 单元测试更容易,因为您可以隔离特定的代码片段并模拟其余部分

以下是一个例子。让我们假装外部图书馆(让我们称之为<center> <div id="gameoverbox"> <h1>GAME OVER</h1> <h1>GREAT SCORE!</h1> <br> <center> <div id="thebuttonovergame"> <a href="#" id="tryagainbutton"> <h1>PLAY</h1> </a> <br> <a href="#" id="backhomebutton"> <h1>HOME PAGE</h1> </a> </div> </center>是为了从网站上检索某些数据。

控制器

ExternalDataRetriever

您的public class ProductController: Controller { private IDataRetreiever DataRetriever {get; set;} public ProductController(IDataRetriever dataRetriever) //this is called Constructor Injection { DataRetriever = dataRetriever; } public ActionResult List() { var data = DataRetriever.GetData(); return View(data); } } 是网站和网桥之间的粘合剂。

IDataRetriever

该类将作为外部库的桥梁。

interface IDataRetriever
{
    public DataType GetData();
}

创建控制器时,构造函数需要public class ExternalDataRetrieverBridge : IDataRetriever { public DataType GetData() { /* make calls to ExternalDataRetriever here to get the data */ } } 的实例。在Dependency Injection容器中(我更喜欢Ninject),您可以让它为控制器构造函数提供IDataRetriever的实例,以满足对ExternalDataRetrieverBridge的依赖。以下是配置Ninject以执行此操作的代码:

IDataRetriever