irfankhan200 Ответов: 1

Проблема внедрения зависимостей с ninject


Привет,

Я пишу приложение mvc 4 и использую Ninject для внедрения зависимостей. Класс внедрения зависимостей, как показано ниже

public class NinjetDependencyResolver : IDependencyResolver
{
    private IKernel kernel;

    public NinjetDependencyResolver()
    {
        kernel = new StandardKernel();
        this.AddBindings();
    }

    private void AddBindings()
    {
        //Add binding here
        kernel.Bind<IHRRepository>().To<HRRepository>();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }
}


этот класс нормально работает с контроллерами. Но я создал класс, как указано ниже

public class RoleVerfier
     {
       private IHRRepository repository;

       public RoleVerfier(_repository)
       {

           this.repository = _repository;
       }

       //some code here for funcionality
   }


и когда я пытаюсь создать объект класса RoleVerifier, как показано ниже

try
{
       RoleVerfier verifier = new RoleVerfier();
                            
       //some code here for funcionality
                           
}
catch (Exception ex)
{

}


Это дает ошибку времени компиляции, потому что конструктор класса RoleVerifier просит предоставить интерфейс IHRRepository. Но я думаю, что интерфейс IHRRepository должен автоматически предоставляться Ninject, как это делается для классов контроллеров.


Я не знаю, в чем дело?

Что я уже пробовал:

Пожалуйста, помогите мне как можно скорее

Maciej Los

Что такое точное сообщение об ошибке? Пожалуйста, улучшите свой вопрос и предоставьте это сообщение.

1 Ответов

Рейтинг:
1

F-ES Sitecore

Ваш код создает новый экземпляр класса, поэтому вам нужно подчиняться правилам конструктора. В вашем коде нет ничего, что использовало бы Ninject, поэтому вы не выполняете разрешение зависимостей. Что вам нужно сделать, так это использовать DependencyResolver, чтобы получить экземпляр вашего класса

c# - Asp.net MVC 4 Dependency resolver - переполнение стека[^]

Если ваш резольвер ninject зарегистрирован как резольвер зависимостей, то использование DependencyResolver в соответствии с приведенной выше ссылкой передаст создание объекта в ninject, и конструктор будет введен для вас ninject. Причина, по которой ваш код работает для контроллеров, заключается в том, что когда MVC framework создает экземпляр вашего контроллера, он использует для этого DependencyResolver. Вы не можете просто создавать классы, как обычно, используя "new", и ожидать, что они будут перенаправлены через ninject.


irfankhan200

Я настроил распознаватель зависимостей
Вот код

публичный класс MvcApplication : System. Web. HttpApplication
{
охраняемых недействительными событий Application_Start()
{
Районная регистрация.RegisterAllAreas();

DependencyResolver.SetResolver (новый NinjetDependencyResolver());

WebApiConfig.Регистр (GlobalConfiguration.Конфигурация);
FilterConfig.RegisterGlobalFilters (Глобалфильтры.Фильтры);
RouteConfig.RegisterRoutes (RouteTable.Маршруты);
BundleConfig.RegisterBundles (BundleTable.Связки);
Объект.RegisterAuth();
}
}


И он работает для контроллеров вот код как я использую его в контроллере

public class DepartmentController : контроллер
{
//
// Вам: /Департамент/
частный репозиторий IHRRepository;
public DepartmentController(ihrrepository rep)
{
это.хранилище = рэп;
}
индекс public ActionResult()
{
пробовать
{
Модели.DepartmentModel model = новые модели.DepartmentModel();
модель.departmentsList = это.репозиторий.Отделы;
model. department = новые сущности.Отдел();
Видовая сумка.OperationName = " Добавить Отдел";

обратный вид(модель);
}
поймать (исключение бывший)
{
return View ("ошибка");
}
}
}

F-ES Sitecore

Поэтому используйте DependencyResolver.Текущий.GetService, чтобы получить экземпляр класса.

irfankhan200

Спасибо это сработало