猿问

如何修复结构映射 DI 错误 = 控制器构建中发生的值不能为空

场景是; VS2017、MVC 5、StructureMap.MVC5


我收到以下错误:


构建类型 BLL.MMCodes.MMCodesService 时出错。" InnerException {"值不能为空。\r\n参数名称:字符串"}


尝试运行我的应用程序时出现在“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 属性中的 null,但没有成功。


胡子哥哥
浏览 176回答 1
1回答

人到中年有点甜

问题是这个代码:public MMCodesService(){&nbsp; &nbsp; ValidateAgainstBizRules( MMCode, out errorMessage);}构造函数中的代码抛出异常。因此StructureMap无法将其传递给依赖于它的那些对象。因此,您可以修复代码以使其不引发异常。但是……我几乎可以肯定代码应该被删除/注释掉。代码在构造函数中被调用。因此,根据定义,MMCode尚未设置 - 因此对其进行任何类型的验证都是毫无意义的。因此,我建议将代码更改为:public MMCodesService(){}
随时随地看视频慕课网APP
我要回答