在 MVC 中使用 DI 时的大量控制器构造函数参数列表

2024-05-02

我正在开发 ASP.NET MVC3 解决方案,该解决方案使用 autofac 的依赖注入。 我们的控制器由 autofac 正确创建,所有必需的对象都正确传入。这些对象通常包括服务、存储库和将域对象转换为 MVC(视图)模型的映射器。所以控制器构造函数看起来有点像:

public abcController(
        ILogger logger,
        IabcRepository abcRepository,
        IabcService abcService,
        IMapper<AbcDomain, AbcViewModel> abcMapper,
        ...
        )

不幸的是,随着时间的推移,这些构造函数参数列表往往会增长得很快。我们的一些控制器现在需要 60 个或更多参数。

我们在这里创建了一些反模式吗?

EDIT

我应该提到我们尝试遵循瘦控制器模式。此外,大多数参数往往是映射器 - 大约 66%。控制方法通常非常简单,遵循以下模式:

  • 根据参数调用适当的服务或存储库
  • 使用映射器将结果转换为适当的视图模型
  • 将视图模型传递给视图

或者这个模式:

  • 从后期操作接收模型
  • 使用映射器将其转换为适当的域对象
  • 使用域对象调用适当的服务或存储库

尽管我同意大多数其他答案,但我无法真正谈论您应该如何重新构建控制器 - 60 个传入参数已经很多了。

可能有助于减少参数数量但不会减少依赖项数量的东西是聚合服务支持 https://code.google.com/p/autofac/wiki/AggregateServiceAutofac 有。

您可以采用包含 60 个属性的单个聚合参数,而不是直接采用 60 个参数。

您使用依赖项创建一个接口(只是接口,实际上不必实现它):

public interface IMyAggregateService
{
  IFirstService FirstService { get; }
  ISecondService SecondService { get; }
  IThirdService ThirdService { get; }
  IFourthService FourthService { get; }
}

然后修改您的控制器以采用该聚合接口:

public class SomeController
{
  private readonly IMyAggregateService _aggregateService;

  public SomeController(
    IMyAggregateService aggregateService)
  {
    _aggregateService = aggregateService;
  }
}

您可以注册聚合服务接口、依赖项和控制器,当您解析控制器时,聚合服务接口将自动为您实现和解析。

var builder = new ContainerBuilder();
builder.RegisterAggregateService<IMyAggregateService>();
builder.Register(/*...*/).As<IFirstService>();
builder.Register(/*...*/).As<ISecondService>();
builder.Register(/*...*/).As<IThirdService>();
builder.Register(/*...*/).As<IFourthService>();
builder.RegisterType<SomeController>();
var container = builder.Build();

再说一遍,它并没有涉及需要那么多依赖项的更大问题,但如果您只是想简化构造函数和控制器上的属性数量,使其更易于管理,这是 Autofac 提供的一种策略可以帮助您解决这一问题。 。

查看 wiki 页面了解更多详细信息。 https://code.google.com/p/autofac/wiki/AggregateService

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MVC 中使用 DI 时的大量控制器构造函数参数列表 的相关文章

随机推荐

  • 从 Rcpp C++ 函数获取 r 函数参数

    我在 R 端定义了一个函数 如下所示 foo lt function arg1 arg2 arg3 以及使用 Rcpp 的 C 函数 该函数获取全局环境并实例化 R 函数以从该函数执行它 这是代码 namespace Rcpp void m
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • 向项目添加资源的设计

    我有课Project Resource and File where A Project包含列表资源 Each Resource包含以下列表Files特定类型的 这被映射到 XML
  • 在基于 RESTful 的应用程序中管理状态

    我们正在评估用于基于 Web 的应用程序的技术 一些建议是采用基于 RESTful 的服务方法 技术堆栈 1 春天 2 Apache CXF JAX RS 我的问题是 1 如何在请求之间管理状态 例如 用户已经过身份验证 现在他正在发出一系
  • Python 3:如何更改GDAL中的图像数据?

    我有一个 GeoTIFF 图像 其中包含颜色表和带有 8 位表键的单个栅格带 并且使用 LZW 压缩 我加载该图像gdal Open https gdal org python osgeo gdal module html 我还有一个包含
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • JS中的递归排序

    在一次采访中 我被要求编写一个程序 算法来使用递归对数字数组进行排序 虽然我含糊地回答了它 但我尝试并想出了以下代码 您可以使用以下JSFiddle https jsfiddle net RajeshDixit 2u9mLegv 1 链接来
  • Twitter 个人资料图像 API 已弃用

    我正在使用 Twitter API 版本 1 并将其替换为 v1 1 然后我在 1 1 版本上找不到 users profile image screen name API https api twitter com 1 users pro
  • 安卓中的界面

    我在 android 中编写了一个包含图像和视频视图的表格布局 我想在 android 中编写一个界面 它将在不干扰我的布局的情况下获取图像以及数据和视频 该数据可以采用任何形式 来自任何来源 并且必须通过接口提供给布局 我应该如何为我在a
  • 如何重构这些 switch case 以处理用户在自然语言中的选择?

    我正在编写几个嵌套的 switch 语句 在某些地方有很多情况 我试图找出一种方法来创建一个案例列表 然后在以后的 switch 语句中引用 有没有办法做到这一点 它肯定会清理我的代码 例如 我有四个单独的案例来回答 是 我正在寻找一种方法
  • 如何在Python中通过URL下载Azure Blob存储文件?

    我正在尝试从我的存储帐户下载 Azure Blob 存储文件 为此 我检查了 URL 是什么 并且正在执行以下操作 with urllib request urlopen
  • 使用 Spring 通过构造函数自动装配集合

    我有一个看似简单的问题 如标题所示 这是我的课程类型 public class Foo Autowired public Foo Qualifier bar Set
  • 正则表达式匹配7-12位数字;可能包含空格或连字符

    我已经尝试解决 PHP 正则表达式问题有一段时间了 但我就是无法完全完成 我需要编写一个匹配 7 到 12 位数字 0 9 的正则表达式 并且可以选择在相邻数字之间有一个连字符或一个空格 这就是我到目前为止所拥有的 match1 preg
  • python 正则表达式中括号的奇怪行为

    我正在编写一个 python 正则表达式 它可以在文本文档中查找引用的字符串 从黑匣子中记录的航空公司飞行员的引用 我首先尝试编写具有以下规则的正则表达式 返回引号之间的内容 如果以 single 打开 则仅在以 single 关闭时返回
  • CodeCommit 错误 Elastic Beanstalk (AWS)

    运行后 pip install upgrade awsebcli 尝试执行以下操作时出现以下错误 eb deploy 无法将代码推送到 CodeCommit 存储库 错误 CommandError 处理 git 命令时发生错误 错误代码 1
  • Java替换特殊字符

    我试图用仅包含特殊字符的模式替换文件中的特殊字符 但它似乎不起作用 String special Something great that special special replaceAll as 但是 当我运行时 我得到原始字符串而不是
  • AppCompat SearchView 图标无法消失

    我正在使用 android support v7 widget SearchView 我需要让这个搜索图标消失 我有带有 SearchView 的自定义 ActionBar 布局
  • PHP - 计算特定数组值

    如何计算数组中值等于常量的元素的数量 例子 myArray array Kyle Ben Sue Phil Ben Mary Sue Ben 如何直接知道里面有多少个 Ben array array Kyle Ben Sue Phil Be
  • 为什么我在 Python 中收到“连接被拒绝”错误? (插座)

    我是套接字新手 请原谅我完全缺乏理解 我有一个服务器脚本 server py usr bin python import socket import the socket module s socket socket Create a so
  • 在 MVC 中使用 DI 时的大量控制器构造函数参数列表

    我正在开发 ASP NET MVC3 解决方案 该解决方案使用 autofac 的依赖注入 我们的控制器由 autofac 正确创建 所有必需的对象都正确传入 这些对象通常包括服务 存储库和将域对象转换为 MVC 视图 模型的映射器 所以控