代码之家  ›  专栏  ›  技术社区  ›  VAAA

C ninject在实例化类中注入依赖项

  •  1
  • VAAA  · 技术社区  · 6 年前

    我有一个 C# MVC 项目使用 Repository Pattern Ninject (地)。一切正常。

    在存储库中,im实例化类以处理对外部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 IM创建了该类的新实例:

    var api = new ExternalAPI(_appState);
    

    有什么建议,我该怎么注射 碘沉积 工作 外部API 上课?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nkosi    6 年前

    参考 Explicit Dependencies Principle

    方法和类应该显式地(通常通过方法参数或构造函数参数)需要它们所需的任何协作对象才能正常工作。

    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 依赖于 外部API 所以这就是应该注入的。

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