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