我在概念方面存在问题,而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();
}
有一个存储库,它与上述编码相同的数据层连接。
请告诉我上面的代码是否可以依赖注入,或者我应该更改任何代码?实际上我没有任何正确的想法,这些模块是否正确解耦。
答案 0 :(得分:0)
您不需要那些默认构造函数。
代码中的某个位置需要在依赖容器autofac中注册类/接口,可能在global.ascx中。你能提供那些代码......?
您也可以通过扫描您在此链接中显示的程序集 Autofac Scanning Assemblies for certain class type
答案 1 :(得分:0)
达林在评论中提到。根据您提供的代码,只需删除您提供的无参数构造函数。所以删除所有看起来像这样的构造函数
public EmployeeController() : this(new EmployeeService())
{
}
这被视为Poor man's DI
使用您需要的容器实现您想要的效果 1.用能够识别容器的控制器工厂替换控制器工厂。 2.使用容器注册所有接口/实现类
所以对于1.你需要这样做(所有的例子都使用Windsor,但概念是相同的)
public class WindsorControllerFactory : DefaultControllerFactory
{
// Fields
private readonly IKernel _kernel;
// Methods
public WindsorControllerFactory(IKernel kernel)
{
if (kernel == null)
throw new ArgumentNullException("kernel");
_kernel = kernel;
}
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null)
throw new HttpException(0x194,
string.Format(
"The controller for path '{0}' could not be found or it does not implement IController.",
context.HttpContext.Request.Path));
return (IController) _kernel.Resolve(controllerType);
}
}
在Global.asax中,创建容器并注册依赖项
Container = new WindsorContainer().Install(FromAssembly.This());
不是安装(..)。这是一个Windsor功能,可以查找所有&#34;安装程序&#34;
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient());
}
}
这个&#34;安装程序&#34;概念是温莎的事情。请注意其中的注册码。您将拥有看起来像是用相应的服务注册每个接口的代码。
并更换控制器工厂。
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(Container.Kernel));