我正在开发一个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注入依赖?
答案 0 :(得分:2)
您必须更改派生类型(WishListController
,CartController
等...)构造函数,以将所需参数(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;
}