首页 > 解决方案 > 如何修复结构映射 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 属性中的空值,但没有成功。

标签: c#asp.netasp.net-mvc-5structuremap

解决方案


问题是这段代码:

public MMCodesService()
{
    ValidateAgainstBizRules( MMCode, out errorMessage);
}

构造函数中的代码抛出异常。因此StructureMap无法将它传递给那些依赖它的对象。

因此,您可以修复代码以使其不会引发异常。

但是...

我几乎可以肯定代码应该被删除/注释掉。代码在构造函数中被调用。因此,根据定义,MMCode尚未设置 - 因此针对它运行任何类型的验证都是没有意义的。因此,我建议将代码更改为:

public MMCodesService()
{
}

推荐阅读