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中RavenDB中的多租户索引
- asp.net – 如何更改FileUpload控件(System.Web.UI.WebCont
- asp.net – 为什么IIS线程这么珍贵与常规CLR线程相比?
- asp.net – 如何发布站点从命令行与一些发布配置文件?
- asp.net-mvc – 我可以在MVC 3中有/多个_Layout页面吗?为c
- asp.net – 如何在Ember.js应用程序中使用ASP .NET Web API
- asp.net-mvc – 如何将现有的asp.net应用程序迁移到asp.net
- asp.net-mvc – Asp.Net MVC捆绑,最好的方式来检测丢失的文
- .net – 强制ActionLinks呈现为小写
- asp.net-mvc – 从控制器操作返回301重定向
- asp.net – gridview在viewstate中保存数据吗?
- .NET WebApi jsonapi.org支持
- ASP.NET WSAT(网站管理工具)和自定义成员资格提供
- asp.net – 如何以编程方式触发dropdownlist.sel
- 为什么我需要在ASP.NET控件上调用处理?
- asp.net-mvc-4 – Resharper无法解析主页中的部分
- 有人创建安装程序来部署内部asp.net Web应用程序
- asp.net – 在SQL Server中将日期转换为刻度
- asp.net – VirtualPathUtility.ToAbsolute()VS.
- asp.net-mvc – MVC 3 Ajax.ActionLink不能正常工
