ASP中方法定位的标准是什么?asp.net MVC 5
本文关键字:asp net MVC 是什么 标准 方法 定位 ASP | 更新日期: 2023-09-27 18:04:51
我有一个MVC应用程序。我持观望态度。我有一系列方法,这些方法调用外部库、实例化类并调用方法(当前在每个视图的控制器中定义)。
我跨多个控制器重用这些方法。
我想确保这个应用程序继续保持松耦合。
我的问题是为那些谁知道MVC,什么是公认的标准的MVC?
我看到三个选项:
-
创建一个包含方法的类,并在每个控制器中实例化这些方法。这样我就在单个控制器和库之间有了一些东西。
-
将方法添加到类继承的模型中,并从类中调用这些方法。然而,这样我所有的控制器都将与模型紧密耦合。
-
将库中的方法直接添加到每个控制器中。我将与库紧密耦合,但每个控制器都有自己的私有方法,我可以调用。
-
这里的细节很模糊,所以我不能详细说明太多。我认为应该决定结构的是库是否有助于业务逻辑或控制器逻辑,因为它在应该合并的地方变得简单。
business logic:
类包装器与您的模型
controller logic:
类包装器(或BaseController或类似)与控制器逻辑相结合
我确实倾向于同意如果可能的话保持外部库的分离是很好的。
这是一个相当大的话题。但一般来说,你应该为依赖注入设置一些东西。
您的外部库将公开某些方法。您应该将该外部库视为可以随时交换的库。因此,一般做法是编写一个接口,定义外部库应该执行的所有操作,并且您的控制器应该只有知道该接口。这使得控制器不必知道它不需要知道的外部接口的细节,从而防止它们紧密耦合。
这有几个优点:
- 它可以很容易地快速更换组件,使您的网站更模块化
- 更容易进行单元测试,因为您可以隔离特定的代码片段并模拟其余部分
下面是一个例子。让我们假设外部库(我们称之为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 */
}
}
创建控制器时,构造函数需要IDataRetriever
的实例。在你的依赖注入容器(我更喜欢Ninject),你可以让它提供ExternalDataRetrieverBridge
的实例控制器构造器,以满足对IDataRetriever
的依赖。下面是配置Ninject的代码:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDataRetriever>().To<ExternalDataRetrieverBridge>();
}