You are right, Belvasis. I normally don't like the service locator pattern, but in this case it is the best option.
-Markus 2010/8/1 Belvasis <belvasis...@googlemail.com>: > Maybe i miss something, but why passing a Repository into a method? > Why not use a container like Windsor or something else to access the > Repository? > > class Computer > { > bool IsInstalled(InstallationPackage installationPackage) > { > IInstallationRepository instRepo = > ServiceManger.Resolve<IInstallationRepository>(); > ... > } > } > > So you can still simply use computer.IsInstalled(installationPackage). > > 2010/7/31 Markus Zywitza <markus.zywi...@gmail.com> >> >> 2010/7/31 josh robb <josh_r...@fastmail.fm>: >> > There's nothing wrong with passing a LicenseRepository into a method >> > on the Software class. This allows easy testing and also stops >> > coupling your models to persistence. >> > >> > class Software{ >> > bool IsValidLicenseCombination(LicensesRepository repo) { >> > var licenses = repo.FindValidLicenses(this,...); >> > .... >> > } >> > } >> > >> > This doesn't end up with an anemic model or a transaction script. >> > Although you still need to have the repo somewhere to pass in. >> >> This works well in theory. Looking back at my example of license >> management, I have not only Software and License, I also have >> LicenseInstance, Installation and Computer as aggregate roots among >> other entities. >> I also modeled a lot of relations as unidirectional many-to-one >> relations: License have thousands of LicenseInstances, but most of the >> time I only need counting used and unused ones, so there isn't any >> Instances collection in License. The situation between Computer and >> Installation is similar: Computers might have hundreds of >> installations, but the only thing I need to know most of the time is >> whether an installation was required and done on a computer. >> The method sketched above tests whether there are installation >> packages of that software that are already installed on the computer, >> it checks whether license instances are available and so on. >> In reality, the method ended like converting this: >> class Software >> { >> public bool CanBeLicensedFor(Computer computer, User user) >> { >> //... >> computer.IsInstalled(this.InstallationPackage); >> //... >> foreach(var license in this.RequiredLicenses) >> { >> var free = LicenseInstance.IsInstanceAvailableOf(license); >> var assigned = computer.IsLicenseInstanceAssigned(license); >> //... >> } >> } >> } >> >> into: >> class Software >> { >> public bool CanBeLicensedFor(Computer computer, User user, >> InstallationRepository instRepo, >> LicenseInstanceRepository licInstRepo) >> { >> //... >> computer.IsInstalled(this.InstallationPackage, >> Installationrepository instRepo); >> //... >> foreach(var license in this.RequiredLicenses) >> { >> var free = licInstRepo.IsInstanceAvailableOf(license); >> var assigned = computer.IsLicenseInstanceAssigned(license, >> licInstRepo); >> //... >> } >> } >> } >> >> I stopped the approach when I had four repositories in a single >> method. That was when I first thought of ActiveRecord should use the >> repositories for me, so I can use ActiveRecord with static methods. I >> would tell AR that I'm testing now and that all data access should be >> stubbed and only these and those methods should return some test >> objects. >> >> -Markus >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Castle Project Users" group. >> To post to this group, send email to >> castle-project-us...@googlegroups.com. >> To unsubscribe from this group, send email to >> castle-project-users+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/castle-project-users?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "Castle Project Users" group. > To post to this group, send email to castle-project-us...@googlegroups.com. > To unsubscribe from this group, send email to > castle-project-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/castle-project-users?hl=en. > -- You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to castle-project-us...@googlegroups.com. To unsubscribe from this group, send email to castle-project-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.