当前位置: 首页 > 编程语言 > C#

MassiveControllerConstructorParameterListWhenUsingDIinMVC分享

时间:2023-04-10 23:39:19 C#

MassiveControllerConstructorParameterListWhenUsingDIinMVC我使用的是ASP.NETMVC3方案,该方案使用依赖注入和autofac。我们的控制器由autofac正确创建,并且所有必需的对象都正确传递。这些对象通常包括将域对象转换为MVC(视图)模型的服务、存储库和映射器。所以控制器构造函数看起来像这样:publicabcController(ILoggerlogger,IabcRepositoryabcRepository,IabcServiceabcService,IMapperabcMapper,...)不幸的是,随着时间的推移,这些构造函数参数列表往往增长得非常快。我们的一些控制器现在需要60个或更多参数。我们在这里创建一些反模式吗?编辑我应该提到我们正在尝试遵循瘦控制器模式。此外,大多数参数往往是映射器——大约66%。控制方法通常非常简单并遵循以下模式:或者这种模式:60个或更多参数很多。在您的问题中,您说“..这些对象通常包括将域对象转换为MVC(视图)模型的服务、存储库和映射器……”您有一个胖控制器(不是Thomas的任务引擎类),但是一个控制器确实太多了。我正在寻找的平衡是胖模型瘦控制器。IanCooper在这篇博文中谈到了它您还可以查看哪些参数实际上是交叉问题。例如,我认为Mapping和Logging是横切关注点,因此您可以使用ActionFilters来清理您的控制器。我真的不能说你应该如何重新设计你的控制器,虽然我同意大多数其他答案-60个传入参数很多。可能有助于减少参数数量而不是依赖数量的是Autofac具有的聚合服务支持。您可以获取包含60个属性的聚合参数,而不是直接获取60个参数。您可以创建一个具有依赖关系的接口(只是接口,您实际上不必实现它):publicinterfaceIMyAggregateService{IFirstServiceFirstService{get;}ISecondServiceSecondService{得到;}IThirdServiceThirdService{得到;}IFourthServiceFourthService{得到;}}然后修改您的控制器以获取该聚合接口:publicclassSomeController{privatereadonlyIMyAggregateService_aggregateService;publicSomeController(IMyAggregateServiceaggregateService){_aggregateService=aggregateService;您可以在解析控件时注册聚合服务接口、依赖项和控制器使用服务器时,聚合服务接口会自动为您实现和解析。varbuilder=newContainerBuilder();builder.RegisterAggregateService();builder.Register(/*...*/).As();builder.Register(/*...*/).As();建设者。注册(/*...*/).As();builder.Register(/*...*/).As();builder.RegisterType();varcontainer=builder.Build();同样,它不会涉及需要许多依赖项的更大问题,但如果您只是想简化构造函数和控制器上的属性数量以使其更易于管理,这就是Autofac提供的策略。.查看wiki页面了解更多详情。如果这在很大程度上取决于创建视图模型,那么这个问题和答案可能会有所帮助。MVC-具有多个选择列表的控制器我还会查看Manning的MVC4inAction。它包括创建自动化映射的ActionResult。在我的应用程序中,我的大部分控制器操作都是一行。拉动实体并将其传递给Automapping并丰富视图结果或接受命令并将其传递给处理它的操作结果Jimmy的这篇博客文章涵盖了一些POST方面http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/基本上,我得到一个域对象(来自repo或其他)并返回一个映射到适当VM的自动映射结果。返回AutoMappedView(新检查(_assetRepository.Find(assetId)));映射器ViewResult然后将其传递给更丰富的(如果发现一个实现IModelEnricher。请参阅其他堆栈问题。返回时它作为命令发回,然后命令处理有一点像Bogardpost。publicvirtualActionResultCreate(AddAssetExaminationCommandaddAssetExaminationCommand,ICommandHandleraddExaminationHandler){returnProcessForm(addAssetExaminationCommand,addExaminationHandler,RedirectToAction(MVC.OnboardAsset.Examinations.Create()),RedirectToAction(MVC.OnboardAsset.Examinations.Index(addAssetExaminationCommand.AssetId)));}如果验证失败,则重定向到GET并合并Modelstate(PRG模式使用类似的东西),因此错误仍然存??在。如果它是一个有效的命令处理程序处理它,我们将重新定向到成功页面(免责声明:这个答案是关于参数列表大小。它不会减少依赖性内部控制器)在这种情况下,您正在注入一个工厂。例如:interfaceIABCFactory{ILoggerCreateLogger();IABCRepositoryCreateRepo();//..etc}然后你的构造函数变成:privateILogger_logger;公共abcController(IABCFactory工厂){_logger=factory.CreateLogger();//..etc}请注意,您可以注入公共属性..但是否要将其公开给外界取决于您。如果你不想破坏包装,那么你就去工厂。以上就是《C#学习教程:MVC中使用DI时的大型控制器构造函数参数列表》的全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注—本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处: