在ASP.NET MVC中使用BaseController中的Ninject

时间:2016-07-07 06:27:48

标签: asp.net-mvc dependency-injection ninject ninject.web.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;
            }

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

类似的东西:

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

请参阅MSDN

答案 1 :(得分:0)

为什么在BaseController构造函数中执行依赖注入。 正确的方法是在Controller的构造函数中使用它。

从BaseController中删除它

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

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

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

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