在 ASP.NET MVC 的 BaseController 中使用 Ninject

Using Ninject in BaseController in ASP.NET MVC

我正在开发一个 Asp.Net Mvc 项目。在我的项目中,我所有的控制器都继承自 BaseController。我在 BaseCotroller 中做最常见的事情。我正在使用 Ninject 进行依赖注入。但是我在向 BaseController 注入依赖时遇到问题。

这是我的 BaseController

public class BaseController : Controller
    {
        protected ICurrencyRepo currencyRepo;
        public Currency Currency { get; set; }

        public BaseController()
        {
            this.currencyRepo = new CurrencyRepo();
        }

        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            Currency cur = null;
            base.Initialize(requestContext);
            Url = new UrlHelperAdaptor(base.Url);
            string currencyIdString = HttpContext.Application["currency"].ToString();
            if(string.IsNullOrEmpty(currencyIdString))
            {
                cur = currencyRepo.Currencies.FirstOrDefault(x => x.Default);
            }
            else
            {
                int id = Convert.ToInt32(currencyIdString);
                cur = currencyRepo.Currencies.FirstOrDefault(x => x.Id == id);                
            }
            if (cur == null)
            {
                cur = currencyRepo.Currencies.FirstOrDefault();
            }
            if(cur!=null)
            {
                AppConfig.CurrentCurrencyUnit = cur.Unit;
                AppConfig.CurrentCurrencyMmUnit = cur.MmUnit;
            }
            Currency = cur;
        }
    }

如您所见,我必须在构造函数中启动 CurrencyRepo 实例而不使用 Ninject。

我想要的构造函数是这样的

 public BaseController(ICurrencyRepo repoParam)
            {
                this.currencyRepo = repoParam;
            }

但是如果我这样做并且 运行 我的项目,它会给我如下错误。

那么如何在 BaseController 中使用 ninject 注入依赖项?

您必须更改派生类型(WishListControllerCartController 等...)构造函数以将所需参数 (ICurrencyRepo) 传递给基本控制器构造函数。

类似于:

public class WishListController : BaseController
{
    public WishListController(ICurrencyRepo currencyRepo) : base(currencyRepo)
    {
    }
}

MSDN

为什么要在 BaseController 构造函数中进行依赖注入。 正确的做法是在你要使用它的Controller的Constructor中进行。

从 BaseController 中删除这个

public BaseController()
        {
            this.currencyRepo = new CurrencyRepo();
        }

将此 protected ICurrencyRepo currencyRepo; 更改为此 protected ICurrencyRepo CurrencyRepo;

并在继承自 BaseController 的 Controller 中添加:

public WishListController(ICurrencyRepo currencyRepo)
        {
            CurrencyRepo = currencyRepo;
        }