Я немного борюсь с репозиториями. Я использую C# и NHibernate. Вопрос, который у меня есть, заключается в следующем: сколько должен делать мой репозиторий до того, как он назовет сохранение или получить?Сколько логических я должен поместить методы репозитория при использовании шаблона репозитория?
Например, у меня есть пользовательский класс, который является совокупным корнем. Я хочу вызвать метод «register», который добавит пользователя и установит некоторые значения по умолчанию на основе бизнес-правил и создаст некоторые другие объекты, которые также являются поднаборами «пользовательского» корня (то есть адреса, групп и т. Д.). Должен ли я позвонить
userRepo.Register(newUser);
, который бы (не обращая внимания на очевидные проблемы):
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
Session.Save(g);
Session.Save(newUser);
}
или должен я поставил регистр в бизнес-уровне и имеют это делают:
Regsiter(User newUser){
newUser.SomeProp = "Default Data";
Group g= new Group;
g.SomeProp2 = "Default Data";
newUser.Groups.Add(g);
userRepo.Register(newUser, g);// this does session.save on both objects.
}
Оба кажется немного неправильным.
Каков правильный подход?
редактировать -------------------------------
спасибо за все ответы. Я не могу решить, кто из них наиболее прав, и поэтому ответ на него принимается.
Как правило, все говорят, что деловые правила в другом слое. это имеет смысл, но я не уверен в вызовах данных для групп. Поскольку группы не являются совокупным корнем, у них не должно быть собственного репозитория, так как я могу добавить и сохранить их? В моем проекте добавление группы в коллекцию групп пользователей автоматически не создает группу в db; Мне также нужно вызвать session.save на объекте. поэтому я помещаю это в пользовательский репо как userRepo.SaveGroup (g)?
Если у меня есть createGroup() на другом слое, тогда ему придется либо использовать собственный репо, либо пользователей. или я толстый?
в этом примере создание группы находится в userfactory. где происходит взаимодействие группы db взаимодействия? в групповом репо или пользовательском репо? –
Всё зависит от: Может быть случай для группового репозитория. На практике попытайтесь ограничить репозитории на один на каждый общий корень. В таком случае используйте GroupRepository, чтобы найти существующую группу и передать Группу в качестве параметра в свой метод UserFactory.CreateNewUser. Когда UserRepository сохраняет пользователя, проверьте свою конфигурацию, чтобы убедиться, что вы также сохраняете ассоциацию групп. –
В качестве альтернативы, может возникнуть смысл создать экземпляр нового объекта User и использовать метод UserServices.RegisterWithDefaultGroup (пользовательский пользователь) со следующей реализацией: Group defaultGroup = _groupRepository.FindByName («По умолчанию»); user.AddGroup (defaultGroup); Регистрация (пользователь); Это действительно зависит от вашего приложения, архитектуры программного обеспечения и от того, насколько вы строго придерживаетесь определенных принципов. Удачи! –