Model view controller MVC数据源:控制器还是模型?

Model view controller MVC数据源:控制器还是模型?,model-view-controller,oop,activerecord,datamapper,Model View Controller,Oop,Activerecord,Datamapper,一个简单的问题:在OOP MVC应用程序中,一个关键原则是职责分离。因此,我认为模型和从数据库、文件、xml、webservice等获取模型的对象应该与模型本身分离。例如,这可以通过实现数据映射器来实现 但是,当我有一个可以从不同来源加载的模型时,我该怎么办?模型应该负责数据源还是由控制器负责? 一个简单的例子是可以从数据库或文件加载的配置类。控制器是否应该指示数据源,或者模型是否应该知道何时从数据库或文件加载配置信息?如果数据源是由控制器MachII、模型胶水(Coldfusion框架)以及J

一个简单的问题:在OOP MVC应用程序中,一个关键原则是职责分离。因此,我认为模型和从数据库、文件、xml、webservice等获取模型的对象应该与模型本身分离。例如,这可以通过实现数据映射器来实现

但是,当我有一个可以从不同来源加载的模型时,我该怎么办?模型应该负责数据源还是由控制器负责?


一个简单的例子是可以从数据库或文件加载的配置类。控制器是否应该指示数据源,或者模型是否应该知道何时从数据库或文件加载配置信息?

如果数据源是由控制器MachII、模型胶水(Coldfusion框架)以及Java中的模型层(ColdSpring)类Spring通知的,则使用了框架

我认为关键是使用对您更有意义的东西,将耦合保持在最低限度并保持一致,这意味着不要将数据源或对象依赖性放在多个位置

您还可以考虑使用Service Type对象来抽象数据源并让它服务于它喜欢的人。

该IOC文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<beans>

  <bean id="chartShareObj" class="model.charts.ChartShared" autowire="byType" />
  <bean id="trendChartObj" class="model.charts.TrendChart" autowire="byType" />

  <bean id="adminRightsDA0" class="org.datamentor.institution.RightsDAO">
    <constructor-arg name="dsn">
      <value>${dsn_dm}</value>
    </constructor-arg>
  </bean>

  <bean id="assessmentManager" class="model.assessment.Manager">
    <constructor-arg name="dsn">
      <value>${dsn_au}</value>
    </constructor-arg>
  </bean>

</beans>
variables.dsn = arguments.dsn.getName();

${dsn_dm}
${dsn_au}

您可以通过控制器中定义的args看到args指定的不同数据源。

如果数据源是由控制器MachII、模型胶水(Coldfusion框架)以及Java中类似Spring的模型层(ColdSpring)通知的,您可以使用框架

我认为关键是使用对您更有意义的东西,将耦合保持在最低限度并保持一致,这意味着不要将数据源或对象依赖性放在多个位置

您还可以考虑使用Service Type对象来抽象数据源并让它服务于它喜欢的人。

该IOC文件可能如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<beans>

  <bean id="chartShareObj" class="model.charts.ChartShared" autowire="byType" />
  <bean id="trendChartObj" class="model.charts.TrendChart" autowire="byType" />

  <bean id="adminRightsDA0" class="org.datamentor.institution.RightsDAO">
    <constructor-arg name="dsn">
      <value>${dsn_dm}</value>
    </constructor-arg>
  </bean>

  <bean id="assessmentManager" class="model.assessment.Manager">
    <constructor-arg name="dsn">
      <value>${dsn_au}</value>
    </constructor-arg>
  </bean>

</beans>
variables.dsn = arguments.dsn.getName();

${dsn_dm}
${dsn_au}

您可以通过控制器中定义的args查看args指定的不同数据源。

根据您的情况和响应,我建议您研究依赖注入。然后,您可以让它根据您想要让它决定事情的变量集来决定使用哪个数据源。当我有多个数据源,并且希望由我选择的一些预先确定的因素来确定数据源时,我会使用这种方法

至于谁应该处理注入,我将其留给存储库工厂,只需在控制器中请求一个接口。然后,工厂根据依赖项注入确定提供哪个存储库

例如:

全局基础结构类中的依赖项注入:

Bind<INewsArticleRepository>().ToMethod(context => NewsRepositoryFactory.Create((NewsRepositoryFactory.RepositoryType)Enum.Parse(typeof(NewsRepositoryFactory.RepositoryType), ConfigurationManager.AppSettings["NewsArticleRepositoryProvider"])));
调用存储库的控制器

private INewsArticleRepository newsItemRepository;

public NewsController(INewsArticleRepository newsItemRepository)
{
    this.newsItemRepository = newsItemRepository;
}

根据您的情况和反应,我建议您研究依赖注入。然后,您可以让它根据您想要让它决定事情的变量集来决定使用哪个数据源。当我有多个数据源,并且希望由我选择的一些预先确定的因素来确定数据源时,我会使用这种方法

至于谁应该处理注入,我将其留给存储库工厂,只需在控制器中请求一个接口。然后,工厂根据依赖项注入确定提供哪个存储库

例如:

全局基础结构类中的依赖项注入:

Bind<INewsArticleRepository>().ToMethod(context => NewsRepositoryFactory.Create((NewsRepositoryFactory.RepositoryType)Enum.Parse(typeof(NewsRepositoryFactory.RepositoryType), ConfigurationManager.AppSettings["NewsArticleRepositoryProvider"])));
调用存储库的控制器

private INewsArticleRepository newsItemRepository;

public NewsController(INewsArticleRepository newsItemRepository)
{
    this.newsItemRepository = newsItemRepository;
}

我在Coldbox中的做法是在模型中使用CB的注入方法。在构造函数的cfargument中,我指定:

<cfargument name="dsn" type="any" inject="coldbox:datasource:dsn">
我希望这有帮助,至少有一点


Rob

我在Coldbox中的做法是在模型中使用CB的注入方法。在构造函数的cfargument中,我指定:

<cfargument name="dsn" type="any" inject="coldbox:datasource:dsn">
我希望这有帮助,至少有一点


Rob

您是否根据视图传递的变量、操作环境等确定数据源?@BryanNaegele:不一定,但这是可能的。在配置示例中,我可能从文件中加载一些全局配置数据,但从数据库中加载一些(用户)特定的数据。其他时候,用户会通过视图和控制器对此决策产生影响。您是否根据视图传递的变量、操作环境等确定数据源?@BryanNaegele:不一定,但这是可能的。在配置示例中,我可能从文件中加载一些全局配置数据,但从数据库中加载一些(用户)特定的数据。其他时候,用户会通过视图和控制器对这个决策产生影响。我似乎遇到的一个问题是,模型并不真正了解程序的上下文。控制器与用户的当前活动几乎是耦合的,而模型则不是。当我让模型选择时,它如何知道是否必须从文件数据库加载数据(继续前面的示例)。@Thanton,这些知识将在IOC(控制反转)层中定义,就像Spring一样。我就是这么看的。正如你所说,模型层应该与应用程序无关,以促进应用程序之间的重用。谢谢你的快速回答。就像布莱恩·内格尔(Bryan Naegele)的回答一样,国际奥委会似乎没有完全回答眼前的问题。工厂模式、依赖注入和上下文化查找等仍然需要在某些地方实现。在模型或控制器中应用这些模式是否有最佳实践?根据您上次的编辑,以下想法是否正确:控制器选择源,模型检查源是否存在并对其进行处理?在控制器中实现,在某种程度上,将有