Как использовать несколько хранилищ с единицей работы? - PullRequest
0 голосов
/ 09 октября 2018

В приведенном ниже коде я хочу получить данные с помощью репозитория или из нескольких репозиториев в контроллере.

У меня два вопроса:

Как не использовать пустой конструктор?а при использовании незакомментированный код возвращает нулевое исключение?

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 голосов
/ 09 октября 2018

• По умолчанию для работы контроллеров требуется конструктор без параметров.Если вы не хотите сохранять неиспользуемый конструктор без параметров в контроллере, вы можете:

  1. переопределить DefaultControllerFactory и связать его, чтобы он возвратил новый экземпляр контроллера сваши зависимости.

    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());

Имейте в виду, что для каждого контроллера вам необходимоподключите зависимости самостоятельно.

Лучшим подходом является использование IoC Container, например StructureMap, для подключения зависимостей.

Просто установите следующий пакет StructureMap.MVC5.Update.

Если ваши зависимости следуют стандартному соглашению IDependency для интерфейсов и Dependency для реализаций, они будут автоматически обнаружены и подключены StructureMap.

Если вам нужно привязать определенную зависимость, перейдите к DefaultRegistry.cs и добавьте свои зависимости.

• Закомментированный код возвращает исключение нулевой ссылки, поскольку вы не передаете модель обратно в представление

var list = x.ToList();
return View(list); //pass the list back
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...