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