【发布时间】:2017-05-01 15:16:05
【问题描述】:
关于依赖注入,我在概念方面和 c# 编码级别遇到问题。到目前为止,我知道我们可以使用 unity 或 autofac 来解决依赖关系。但是我的代码有问题,不管这是否正确。
项目有 4 层。
网络项目
服务水平
存储库级别
- 实体
这是我的 MVC 控制器级代码(在 Web 项目中)
public class EmployeeController : Controller
{
private readonly IEmployeeService _employeeService;
public EmployeeController() : this(new EmployeeService())
{
}
public EmployeeController(IEmployeeService employeeService)
{
_employeeService = employeeService;
}
public ActionResult EmployeeList()
{
try
{
EmployeeVM empVM;
List<EmployeeVM> lstEmpVM = new List<ViewModel.EmployeeVM>();
var empList = _employeeService.GetAllEmployeeList();
//below foreach use to map domain object to viewmodel object.
foreach (var item in empList)
{
empVM = new EmployeeVM();
empVM.EmployeeId = item.EmployeeId;
empVM.Department = item.Department;
empVM.FirstName = item.FirstName;
empVM.LastName = item.LastName;
empVM.Permenent = item.Permanent;
lstEmpVM.Add(empVM);
}
return View(lstEmpVM);
}
catch (Exception ex)
{
throw;
}
}
}
这是我的EmployeeService服务级别代码(在服务级别)
public class EmployeeService : IEmployeeService
{
private readonly IEmployeeRepository _empRepository;
public EmployeeService() : this(new EmployeeRepository())
{
}
public EmployeeService(IEmployeeRepository empRepository)
{
_empRepository = empRepository;
}
public IEnumerable<Employee> GetAllEmployeeList()
{
try
{
var ObjEmpList = _empRepository.GetEmployees();
return ObjEmpList;
}
catch (Exception ex)
{
throw;
}
}
//Some logical code going here
}
这是EmployeeService的接口
public interface IEmployeeService
{
IEnumerable<Employee> GetAllEmployeeList();
}
有一个repository,和上面的编码一样连接数据层。
请告诉我我上面的代码可以使用依赖注入,还是我应该更改任何代码?其实我没有任何正确的想法,这些模块是否正确解耦。
【问题讨论】:
-
只需从
EmployeeController和EmployeeService类中删除默认的无参数构造函数,您的代码就适合 DI。使用这些默认构造函数,您当前可以在不同层和依赖项的特定实现之间进行耦合。将特定实现注入服务应该是 DI 框架的责任。 -
如果您在项目中实际使用 Unity 或 Autofac,那么您不需要上述任何类的默认构造函数。鉴于依赖项配置正确,它们将在运行时解决,而无需您担心。
-
如果我不打算使用 unity 或 autofac,我真的不能用 DI 做我的项目吗?
-
@weeraa - 如果您不想使用容器,可以使用pure DI。该容器是完全可选的 - 但您仍然需要绑定到您使用正确扩展点的任何框架,以便从 composition root 解决依赖关系。在 MVC 中,可以是
IControllerFactory或IDependencyResolver。
标签: c# asp.net-mvc dependency-injection