Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 5中方法位置的标准是什么_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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

C# ASP.NET MVC 5中方法位置的标准是什么,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有一个MVC应用程序。我在犹豫。我有一系列方法,它们调用外部库、实例化类并调用当前在控制器中为每个视图定义的方法 我在多个控制器上重复使用这些方法 我想确保这个应用程序在未来保持松散耦合 我的问题是对于那些了解MVC的人来说,什么是公认的MVC标准 我认为有三种选择: 创建一个包含这些方法的类,并在每个控制器中实例化这些方法。这样,我在各个控制器和库之间就有了一些东西 将方法添加到类继承的模型中,并从类中调用方法。然而,我的所有控制器都将与模型紧密耦合 将库中的方法直接添加到每个控制器中。我将

我有一个MVC应用程序。我在犹豫。我有一系列方法,它们调用外部库、实例化类并调用当前在控制器中为每个视图定义的方法

我在多个控制器上重复使用这些方法

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

我的问题是对于那些了解MVC的人来说,什么是公认的MVC标准

我认为有三种选择:

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

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

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


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

业务逻辑:类包装器与模型一起使用

控制器逻辑:与控制器逻辑结合使用的类包装器或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的实例。在依赖项注入容器中,我希望您可以让它向控制器构造函数提供ExternalDataRetrieverBridge的实例,以满足对IDataRetriever的依赖。下面是配置Ninject以实现此目的的代码:

private static void RegisterServices(IKernel kernel)
{           
    kernel.Bind<IDataRetriever>().To<ExternalDataRetrieverBridge>();
}

谢谢,我以前在实体框架中使用过DI,但从来没有在外部库中使用过DI,尽管我想您可以将实体框架称为外部库。