首页 > 解决方案 > c# ninject 在实例化类中注入依赖项

问题描述

我有一个C# MVC使用Repository PatternNinject(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;
        }
 }

我在这里得到一个例外,因为Loggeris null

在我的主项目NinjectWebCommon.cs文件中,我正确注册了依赖项:

private static void RegisterServices(IKernel kernel)
        {

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

任何线索为什么不在课堂[Inject]上工作?ILogRepositoryExternalAPI

也许是因为从 EmployeeRepository 我创建了该类的新实例:

var api = new ExternalAPI(_appState);

任何建议以及如何ILogRepositoryExternalAPI课堂上进行工作注入?

标签: c#dependency-injectionninject

解决方案


引用显式依赖原则

方法和类应该明确要求(通常通过方法参数或构造函数参数)它们需要的任何协作对象才能正常运行。

ExternalAPI依赖于ILogRepositoryAppState所以应该注入它

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));
    //...
 }

推荐阅读