我有一个MVC应用程序。我在围栏上。我有一系列方法调用外部库,实例化一个类,并调用方法(当前在控制器中为每个视图定义)。
我在多个控制器中重用这些方法。
我想确保此应用程序在未来保持松散耦合。
我的问题是那些了解MVC的人,MVC的公认标准是什么?
我看到三个选项:
创建一个包含方法的类,并在每个控制器中实例化这些方法。这样我在各个控制器和库之间就有了一些东西。
将方法添加到类继承的模型中,并从类中调用方法。但是,然后我的所有控制器都会与模型紧密耦合。
直接在每个控制器中添加库中的方法。我会紧紧地耦合到图书馆,但每个控制器都有它自己的私人方法。
答案 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