Использование 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;
        }
Другие вопросы по тегам