ASP中方法定位的标准是什么?asp.net MVC 5

本文关键字:asp net MVC 是什么 标准 方法 定位 ASP | 更新日期: 2023-09-27 18:04:51

我有一个MVC应用程序。我持观望态度。我有一系列方法,这些方法调用外部库、实例化类并调用方法(当前在每个视图的控制器中定义)。

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

我想确保这个应用程序继续保持松耦合。

我的问题是为那些谁知道MVC,什么是公认的标准的MVC?

我看到三个选项:

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

  2. 将方法添加到类继承的模型中,并从类中调用这些方法。然而,这样我所有的控制器都将与模型紧密耦合。

  3. 将库中的方法直接添加到每个控制器中。我将与库紧密耦合,但每个控制器都有自己的私有方法,我可以调用。

ASP中方法定位的标准是什么?asp.net MVC 5

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

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>();
}