Использование Ninject в BaseController в 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;
}
Но если я делаю так и запускаю свой проект, это выдает мне ошибку, как указано ниже.
Итак, как я могу ввести зависимость с помощью ninject в BaseController?
2 ответа
Вы должны изменить свои производные типы (WishListController
, CartController
и т. д.) конструктор для передачи требуемого параметра (ICurrencyRepo
) к конструктору базового контроллера.
Что-то вроде:
public class WishListController : BaseController
{
public WishListController(ICurrencyRepo currencyRepo) : base(currencyRepo)
{
}
}
Смотрите MSDN
Почему вы делаете инъекцию зависимостей в конструкторе BaseController. Правильный способ сделать это в Конструкторе Контроллера, где вы хотите его использовать.
Удалить это из BaseController
public BaseController()
{
this.currencyRepo = new CurrencyRepo();
}
изменить это protected ICurrencyRepo currencyRepo;
к этому protected ICurrencyRepo CurrencyRepo;
И добавьте к контроллеру, который наследует от BaseController это:
public WishListController(ICurrencyRepo currencyRepo)
{
CurrencyRepo = currencyRepo;
}