ICriteria relates to Specification like ActiveRecord-types to a domain model. ICriteria may resemble a specification, but it is actually a query in a fluent API format. If you want to go all the way, then you need a real specification model that is used to create queries by the repository.
Also, I blogged about my experiences with AR+DDD. You might find it useful for your own decision what to do. http://mortslikeus.blogspot.com/2009/01/active-record-and-ddd.html -Markus 2009/1/27 Mark Jensen <don...@gmail.com>: > > This would actually been my next question :) > > usually I would do the same thing you talk about and encapulate the > quiery, but from what I understand with DDD (not saying that this only > goes for DDD, i have just never heard before I started on DDD), you > are allowed to make this sort methods. > > using the Criterion as a parameter for method like the FindOne(), > seems to follow the guideline/rule of the SPECIFICATION Pattern and > thereby add flexiblity to the design. > > The argument to us the FindMeSomething(iNeed) and thereby making hard- > coded quires, should be that the client would have done this anyway. > So it makes sense to make hardcoded quires because they give you some > convience > > But the issue with FindMeSomething(iNeed), is that the developer need > to understand the inner workings/implications of using a encapsulated > metod... meaning that, if they dont know about how the method quiries > the database, they might pull to much data into memory and thereby > bringing the system down. > > you could probably refactor yourself out of this problem, but still... > > > > /Mark > > On Jan 26, 3:55 pm, Markus Zywitza <markus.zywi...@gmail.com> wrote: >> Code from the article you linked: >> >> public virtual T FindOne(params ICriterion[] criteria) >> { >> return ActiveRecordMediator<T>.FindOne(criteria); >> } >> >> This moves the responsibility for creating a particular query from the >> repository to the higher layers, who need to know about an aggregate's >> inner workings. Once you start to optimize for n+1 etc., this >> knowledge of the persistence is rather deepened than encapsulated. >> A better approach is to create a bunch of >> FindByWhateverMyAppNeeds(string iNeedThat). That's ugly, but >> encapsulates persistence within the repository. >> >> -Markus >> >> 2009/1/26 Mark Jensen <don...@gmail.com>: >> >> >> >> > Hi Markus >> >> > Could you explain the contradictions a bit more for me? >> >> > thanks :) >> >> > On Jan 26, 1:22 pm, Markus Zywitza <markus.zywi...@gmail.com> wrote: >> >> You lose nothing with dropping ActiveRecordBase but convenience. >> >> >> But keep in mind: >> >> >> 1) AR classes without ARBase make good DTOs, but still bad domain classes. >> >> 2) Generic repositories are an antipattern. A repository should >> >> encapsulate the knowledge of an aggregate's persistence details. That >> >> contradicts with ready-to-use-plugs for LINQ or criteria queries. >> >> >> If you need to do DDD, use AR as DTO and map it to the domain layer. >> >> If you are doing this because DDD has a momentary hype, just don't do >> >> it at all. The "Domain Model" is not the only enterprise pattern that >> >> yields maintainable software. >> >> >> -Markus >> >> >> 2009/1/26 Mark Jensen <don...@gmail.com>: >> >> >> > Hi >> >> >> > From what i can read on the internet people do really like this >> >> > combination due to the placement of the persitance logic. >> >> >> > how ever, i know that Castles AR has something callsed >> >> > ActiveRecordMediator which seems to be the solution to the problem >> >> > above. (i also know ayendes rhino commons which also have an >> >> > implementation of the repository pattern). >> >> >> > The questions are. >> >> >> > 1. Will i lose something if i stop inheritting from ActiveRecordBase >> >> > and use ActiveRecordMediatior instead? (to me it seems like i will get >> >> > a lot more functionality/control) >> >> >> > 2. Can someone me how to implement the Repository pattern with >> >> > ActiveRecordMediator. I have found this example here >> >> >http://www.lostechies.com/blogs/johnteague/archive/2008/05/27/using-d... >> >> >> > but to me it seems like I would have to make a Repository (and inherit >> >> > from BaseRepository) for every Aggregate and then I need to >> >> > instantiate the Repository it when i want to use it. >> >> >> > Is there a better way of doing this? >> >> >> > :) >> >> >> > best regards, >> >> > Mark > > > --~--~---------~--~----~------------~-------~--~----~ 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-users@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 -~----------~----~----~----~------~----~------~--~---