我是Unity和DI术语的新手,因此试图了解它是如何工作的。我有以下代码使用Unity容器实现DI。
public class DashboardService: IDashboardService
{
private readonly IRepository<USERROLE> repoUserRole;
private readonly IRepository<INSTITUTION> repoInstitution;
public DashboardService(
IRepository<USERROLE> repoUserRole, IRepository<INSTITUTION> repoInstitution)
{
this.repoUserRole = repoUserRole;
this.repoInstitution = repoInstitution;
}
public List<USERROLE> GET(List<string> Id)
{
// Use repoUserRole object to get data from database
}
}
该服务正在由控制器调用:
public class DashboardController : ApiController
{
private readonly IDashboardService dashboardService;
public DashboardController(IDashboardService dashboardService)
{
this.dashboardService = dashboardService;
this.mapper = mapper;
}
//Action method which uses dashboardService object
}
这是Unity配置:
var container = new UnityContainer();
container.RegisterType(typeof(IDashboardService), typeof(DashboardService))
.RegisterType(typeof(IRepository<>), typeof(Repository<>));
return container;
问题:
DashboardService
构造函数,我将得到空的存储库对象。Unity
中存储库接口的依赖关系,那么为什么在那我得到的是空值?答案 0 :(得分:3)
如果我注释掉DashboardService构造函数,那么我得到的是空存储库对象。
当您不向类中添加构造函数时,C#将在编译期间为您生成一个公共的无参数构造函数。这导致Unity调用“不可见的”无参数构造函数,这就是为什么没有初始化任何私有字段的原因。
为防止此类意外的编程错误,请始终确保在项目的“属性构建”选项卡中启用“将所有警告视为错误处理”。这将确保编译器停止编译,因为它会检测到这些未初始化的字段。
有什么方法可以不使用构造函数模式来传递存储库依赖关系吗?
是的,但是您可以使用的所有其他方法都会导致代码异味或反模式。在几乎所有情况下,构造函数注入都是最好的解决方案。