依赖注入代码级别

时间:2017-05-01 15:16:06

标签: c# asp.net-mvc dependency-injection

我在概念方面存在问题,而c#编码关于依赖注入的问题。到目前为止,我知道我们可以使用unity或autofac来解决依赖关系。但是我的代码中存在问题,这是否正确。

项目有4层。

  1. 网络项目

  2. 服务水平

  3. 存储库级别

  4. 实体
  5. 这是我的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();
    
    }
    

    有一个存储库,它与上述编码相同的数据层连接。

    请告诉我上面的代码是否可以依赖注入,或者我应该更改任何代码?实际上我没有任何正确的想法,这些模块是否正确解耦。

2 个答案:

答案 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));