c# - c# ninject 在实例化类中注入依赖项
问题描述
我有一个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
is null
。
在我的主项目NinjectWebCommon.cs
文件中,我正确注册了依赖项:
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
课堂上进行工作注入?
解决方案
引用显式依赖原则
方法和类应该明确要求(通常通过方法参数或构造函数参数)它们需要的任何协作对象才能正常运行。
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));
//...
}
推荐阅读
- sql-server - SQL Server 2014 中的 MASSIVE Identity 列值跳跃
- postgresql - 需要帮助合并重叠的时间间隔
- postman - 在 Postman 集合中,其中一项服务只需要调用一次
- apache-spark - Pyspark ModuleNotFoundError:没有名为“mmlspark”的模块
- logstash - Logback-classic 通过不同的依赖与 SLF4J 发生冲突
- c++ - 为什么 pow(x,1/p) 和 pow(x,1.0/p) 不相等,即使打印它们的值会给出相同的结果
- logging - 如何解决 log4j2 中 TimeBasedTriggerPolicy 的问题
- python - Pandas 根据需要匹配的其他列的值创建新的列 ID
- python - 如何解释 tensorboardX 中的梯度和参数直方图?
- python - 图形用户界面和脚本集成