c# - 如何修复结构映射 DI 错误 = 控制器构建中发生的值不能为空
问题描述
情景是;VS2017, MVC 5, StructureMap.MVC5
我收到以下错误:
构建类型 BLL.MMCodes.MMCodesService 时出错。" InnerException {"Value cannot be null.\r\nParameter name: String"}
尝试运行我的应用程序时在“DoGetInstance”函数中发生。
protected override object DoGetInstance(Type serviceType, string key)
{
IContainer container = (CurrentNestedContainer ?? Container);
if (string.IsNullOrEmpty(key)) {
return serviceType.IsAbstract || serviceType.IsInterface
? container.TryGetInstance(serviceType)
: container.GetInstance(serviceType);
}
return container.GetInstance(serviceType, key);
}
服务和接口
namespace BLL.MMCodes
{
public interface IMMCodesService
{
bool ValidateAgainstBizRules(string MMCode, out string errorMessage);
bool _UseEF
{
get;
set;
}
}
public class MMCodesService : IMMCodesService
{
private string errorMessage;
public MMCodesService()
{
ValidateAgainstBizRules( MMCode, out errorMessage);
}
#region vars
public string MMCode { get; set; }
private bool IsValid { get; set; }
private List<string> Validations = new List<string>();
#endregion
public bool _UseEF { get; set; }
public bool ValidateAgainstBizRules(string mmCode, out string errorMessage)
{....}
控制器
using System.Collections.Generic;
using System.Web.Mvc;
using BLL.MMCodes;
using BusinessLayerDemoProject.Models;
namespace BusinessLayerDemoProject.Controllers
{
public class MMCodeController : Controller
{
private IMMCodesService _iService;
public MMCodeController(IMMCodesService service)
{
this._iService = service;
this._iService._UseEF = true;
}
我已经尝试了来自所有论坛的一些建议,例如。更改中的属性StructureMapDependencyScope
以适应 HTTPContext 和 CurrentNestedContainer 属性中的空值,但没有成功。
解决方案
问题是这段代码:
public MMCodesService()
{
ValidateAgainstBizRules( MMCode, out errorMessage);
}
构造函数中的代码抛出异常。因此StructureMap
无法将它传递给那些依赖它的对象。
因此,您可以修复代码以使其不会引发异常。
但是...
我几乎可以肯定代码应该被删除/注释掉。代码在构造函数中被调用。因此,根据定义,MMCode
尚未设置 - 因此针对它运行任何类型的验证都是没有意义的。因此,我建议将代码更改为:
public MMCodesService()
{
}
推荐阅读
- database - 我无法在 prod 数据库中获取 Oracle 执行计划
- ssl - 本地虚拟主机的 Mamp-Pro SSL
- math - 2 个平面之间的交线
- post - bubble.io 问题:API/原始 HTTP 发布访问?
- c++ - 如何在没有循环的情况下填充 char 数组
- python - 如何在python中获取前2个月和3个月的结束日期
- c++ - 可变参数类模板参数缩减与可变参数函数模板参数缩减
- google-cloud-platform - 在 Apache Beam Python 中对两个 CSV 文件执行左连接
- java - Spring Boot REST API 的自定义异常处理
- python - Selenium/Python - 查找动态创建的字段