asp.net-mvc – 如何使用Autofac将控制器的ModelState传递给我的
我有一个ModelStateDictionary的包装器,我的所有服务都接受它.是否可以配置autofac将控制器ModelStateDictionary注入包装器的构造函数,然后将其注入服务构造函数?
//code public class ModelValidation : IModelValidation { public ModelValidation(ModelStateDictionary msd){...} .. .. } public class CustomerService{ public CustomerService(IModelValidation mv){...} .. } 谢谢 解决方法
根据您的意见,我特此修改我的答案:)
ModelStateDictionary显然不是应该由容器解析的服务,而是应该在实例化时提供的数据.我们可以告诉我,ModelState由每个Controller实例拥有,因此在“解析时间”不可用于容器. 此外,每个ModelValidation实例都将绑定到ModelStateDictionary实例,因此也被视为数据. 在Autofac中,当必须将数据传递给构造函数时(可选地除了其他依赖项之外),我们必须使用工厂委托.这些委托将处理传递给构造函数的依赖项和数据. Autofac的好处在于这些代表可以自动生成. 我提出以下解决方案: 由于ModelValidation和CustomerService都需要构造函数中的数据,因此我们需要两个工厂委托(注意:参数名称必须与其相应构造函数中的名称匹配): public delegate IModelValidation ModelValidationFactory(ModelStateDictionary msd); public delegate CustomerService CustomerServiceFactory(ModelStateDictionary msd); 由于您的控制器不应该知道这些委托来自何处,因此它们应该作为依赖项传递给控制器??构造函数: public class EditCustomerController : Controller { private readonly CustomerService _customerService; public EditCustomerController(CustomerServiceFactory customerServiceFactory /*,...any other dependencies required by the controller */ ) { _customerService = customerServiceFactory(this.ModelState); } } CustomerService应该有一个类似于此的构造函数(可选择在ServiceBase类中处理其中的一些): public class CustomerService { private readonly IModelValidation _modelValidation; public CustomerService(ModelStateDictionary msd,ModelValidationFactory modelValidationFactory) { _modelValidation = modelValidationFactory(msd); } 为了实现这一点,我们需要像这样构建我们的容器: var builder = new ContainerBuilder(); builder.Register<ModelValidation>().As<IModelValidation>().FactoryScoped(); builder.Register<CustomerService>().FactoryScoped(); builder.RegisterGeneratedFactory<ModelValidationFactory>(); builder.RegisterGeneratedFactory<CustomerServiceFactory>(); builder.Register<EditCustomerController>().FactoryScoped(); 因此,当控制器被解析时(例如,当使用the MvcIntegration module时),工厂代表将被注入控制器和服务. 更新:为了进一步减少所需的代码,您可以将CustomerServiceFactory替换为通用的工厂委托,就像我描述的那样here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC:除了IE之外,我如何向所有浏览
- asp.net-mvc – ASP.NET MVC Remote属性方法参数始终传递nu
- asp.net-core – 在ASP.NET vNext过滤器中获取注入对象
- 防止为ASP.NET服务器控件打包标签
- asp.net-mvc – MVC模型状态
- asp.net-mvc-4 – Web API HTTP请求命名约定
- asp.net – Server.Transfer对Google不可见吗?
- asp.net-mvc – 在.Net MVC WS-Federation站点中阻止XmlHtt
- 使用ASP.NET MVC和AJAX进行实时搜索
- asp.net – 什么是asp:DropDownList客户端事件?
- asp.net-mvc – 在一个页面中以两种不同的形式使
- asp.net – 通过嵌套母版页从内容页面访问body元
- asp.net-mvc-3 – 将数据从Action传递给另一个Ac
- asp.net-web-api – 根据Web API请求设置JSON Ca
- asp.net-mvc – Can Meteor可以运行Microsoft后端
- asp.net-mvc – 如何将对象传递给VIewModel的构造
- 对于单个控件,asp.net – ValidateRequest =“fa
- Asp.Net MVC路由表和控制器操作
- .net – 具有流畅验证的Ninjects
- asp.net-mvc – 尝试通过安全透明方法xxx来访问安