c # ninject вводит зависимость в экземпляре класса - PullRequest
1 голос
/ 06 июля 2019

У меня есть проект C# MVC с использованием Repository Pattern и Ninject (DI). Все работает нормально.

Внутри репозитория. Я создаю экземпляр класса для обработки некоторых вызовов внешних API, например:

public class EmployeeRepository : IEmployeeRepository
    {
        private readonly AppState _appState;

        public EmployeeRepository(IAppStateProvider appStateProvider)
        {
            _appState = appStateProvider.AppState;
        }

        public bool ProcessEmployee(long employeeId, object data)
        {
            var api = new ExternalAPI(_appState);
            api.PostData(data);
            return true;
        }
}

Тогда мой ExternalAPI.cs класс:

public class ExternalAPI: BaseRepository
    {
        [Inject]
        public ILogRepository Logger { get; set; }

        private readonly AppState _appState;

        public ExternalAPI(AppState appState)
        {
            _appState = appState;
        }


        private bool PostData(object data)
        {
            bool returnVal = true;

            // Some code here....

            Logger.InsertLog(data); // HERE Logger IS NULL

            return returnVal;
        }
 }

Я получаю исключение, потому что Logger - это null.

И в моем основном проекте NinjectWebCommon.cs файл Im регистрирует зависимость правильно:

private static void RegisterServices(IKernel kernel)
        {

            kernel.Bind(typeof(ILogRepository)).To(typeof(Data.LogRepository));
         }

Любая подсказка, почему [Inject] из ILogRepository не работает в ExternalAPI классе?

Возможно, потому что из EmployeeRepository я создаю новый экземпляр этого класса:

var api = new ExternalAPI(_appState);

Любой совет, и как я могу заставить инъекцию ILogRepository работать в ExternalAPI классе?

1 Ответ

0 голосов
/ 06 июля 2019

Ссылка Принцип явных зависимостей

Методы и классы должны явно требовать (обычно через параметры метода или параметры конструктора) любых взаимодействующих объектов, в которых они нуждаются для правильного функционирования.

ExternalAPI зависит от ILogRepository и AppState, так что именно это должно быть введено в него

public class ExternalAPI: BaseRepository, IExternalAPI {

    private readonly ILogRepository logger;
    private readonly AppState _appState;

    public ExternalAPI(IAppStateProvider appStateProvidere, ILogRepository logger) {
        _appState = appStateProvidere.AppState;
        this.logger = logger;
    }


    public bool PostData(object data) {
        bool returnVal = true;

        // Some code here....

        logger.InsertLog(data); // HERE Logger IS NULL

        return returnVal;
    }
}

EmployeeRepository зависит от ExternalAPI, так чточто должно быть введено в него.

public class EmployeeRepository : IEmployeeRepository {
    private readonly IExternalAPI api;

    public EmployeeRepository(IExternalAPI api) {
        this.api = api;
    }

    public bool ProcessEmployee(long employeeId, object data) {
        api.PostData(data);
        return true;
    }
}

Убедитесь, что все необходимые зависимости зарегистрированы в контейнере

private static void RegisterServices(IKernel kernel) {
    //...
    kernel.Bind(typeof(ILogRepository)).To(typeof(Data.LogRepository));
    kernel.Bind(typeof(IExternalAPI)).To(typeof(ExternalAPI));
    //...
 }
...