如何将多个存储库与工作单元一起使用?

时间:2018-10-09 19:10:12

标签: c# model-view-controller repository-pattern unit-of-work

在下面的代码中,我想使用存储库或从控制器中的多个存储库中获取数据。

我有两个问题:

如何不使用空的构造函数?  并在使用未注释的代码时返回空异常?

public class StudentController : Controller
{
    private IStudentRepository _studentRepository;
    public StudentController() { }
    public StudentController(IStudentRepository studentRepository)
    {
        _studentRepository = studentRepository;
    }        
    public ActionResult Index()
    {
        var x = _studentRepository.GetAll().ToList();
        return View();


        //using (var unitOfWork = new UnitOfWork(new PollingSystemDbContext()))
        //{
        //    var x = unitOfWork.IStudentRepository.GetAll();
        //    var list = x.ToList();
        //    return View();
        //}
    }
}

1 个答案:

答案 0 :(得分:2)

•默认情况下,控制器需要无参数的构造函数才能起作用。如果您不想在控制器中保留未使用的无参数的构造函数,则可以:

  1. 重写DefaultControllerFactory并对其进行连线,以便它返回具有您的依赖关系的Controller的新实例。

    public class CustomControllerFactory : DefaultControllerFactory {
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
            if (controllerType == typeof(StudentController)) {
                return new StudentController(new StudentRepository());
            }
            return base.GetControllerInstance(requestContext, controllerType);
        }
    }
    

然后在global.asax

注册新工厂
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

请记住,对于每个控制器,您需要自己连接依赖项。

  1. 更好的方法是研究使用IoC Container之类的StructureMap为您连接依赖项。

只需安装以下软件包StructureMap.MVC5.Update

如果您的依赖项对于接口遵循IDependency的默认约定,对于实现遵循Dependency的默认约定,则它们将由StructureMap自动拾取并连接。

如果您需要关联特定的依赖项,请导航至DefaultRegistry.cs并添加您的依赖项。

•带注释的代码返回空引用异常,因为您没有将模型传递回视图

var list = x.ToList();
return View(list); //pass the list back