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 <[email protected]>: > 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 <[email protected]> >> >> 2010/7/31 josh robb <[email protected]>: >> > 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 >> [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> 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 [email protected]. > To unsubscribe from this group, send email to > [email protected]. > 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 [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.
