[prev in list] [next in list] [prev in thread] [next in thread] 

List:       struts-user
Subject:    Re: Struts, Business Logic, DAOs
From:       Shyam A <struts_newbie () yahoo ! com>
Date:       2004-04-15 20:03:43
Message-ID: 20040415200343.40715.qmail () web60203 ! mail ! yahoo ! com
[Download RAW message or body]

I'm not sure about the best practice,but I would use
an application specific Controller
(Controller/Mediator pattern)class to perform the
logic. I use a controller class for all related
operations in use case(s) /subsystem.It controls all
interactions between the UI and business layers.
In my Action class, I would call the method in my
controller class, which in turn calls the DAO method.
eg.
in Action class

widgetController.deleteWidget(user,widget);

in WidgetController class,
//logic for checking user type and issuing delete...
......
widgetDAO.deleteWidget(widget);

HTH,
Shyam



--- Paul Barry <paul.barry@nyu.edu> wrote:
> I have a question about business logic.  The best
> way I can think to 
> explain this is with an example.  I know this is
> kind of long, but I am 
> trying to keep this as simple as possible while
> still being able to 
> illustrate the point.  Let's say I have Users and
> Widgets.  I would have 
> Business Objects for each one, something like this:
> 
> public User {
>    public int getId();
>    public boolean isAdmin();
> }
> 
> public Widget {
>    public int getId();
>    public User getCreator();
> }
> 
> Now assume I am using a DAO like this:
> 
> public WidgetDAO {
>    public void delete(int id);
> }
> 
> Assume the implementation of this DAO would delete a
> row from the widget 
> table in the database.  So using struts I would have
> an action with a 
> method like this:
> 
> execute(...) {
>      WidgetDAO.delete(widgetId);
> }
> 
> Assume the widgetId came from an ActionForm, the
> details are irrelevant. 
>   The point is this would all work fine, you could
> call the action with 
> a URL like /deleteWidget.do?widgetId=4 and it would
> delete widget 4. 
> Also, assume there is other logic already handling
> logging in the user 
> so there is a UserBO object in a session attribute,
> which is used to 
> populate the creator property of the Widget.
> 
> But now let's say I have 2 business rules:
> 
> 1.  users that are admins can delete any widget
> 2.  non-admin users can only delete widgets they
> created
> 
> So specifically from the objects above, you can
> delete a widget if 
> user.isAdmin() returns true or
> widget.getCreator().getId() == 
> user.getId().  The question is where should this
> kind of logic go?
> 
> You could get away with putting it in the action,
> but in a real world 
> application this type of logic would be much more
> complicated and 
> probably get re-used across different actions.  The
> Struts guidelines 
> even say this:
> 
> "Rather than creating overly complex Action classes,
> it is generally a 
> good practice to move most of the persistence, and
> "business logic" to a 
> separate application layer. When an Action class
> becomes lengthy and 
> procedural, it may be a good time to refactor your
> application 
> architecture and move some of this logic to another
> conceptual layer; 
> otherwise, you may be left with an inflexible
> application which can only 
> be accessed in a web-application environment."
> 
>
http://jakarta.apache.org/struts/userGuide/building_controller.html#action_classes
> 
> I doesn't seem like this logic belongs in the DAO
> either, because if you 
>   don't want that kind of logic mixed in with code
> to get the data out 
> of the database.  Does it belong in the business
> objects, maybe by 
> expanding the Widget object like this?
> 
> public Widget {
>    public int getId();
>    public User getCreator();
>    public boolean canDelete(UserBO);
> }
> 
> And then canDelete would in turn call a DAO to check
> that?  Or would a 
> separate layer be better, like this:
> 
> public WidgetLogic {
>      public boolean canDeleteWidget(User, Widget);
> }
> 
> 
> Are there any best practices or sample applications
> that you know of 
> that have a good example of a business logic layer?
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
>
---------------------------------------------------------------------
> To unsubscribe, e-mail:
> user-unsubscribe@struts.apache.org
> For additional commands, e-mail:
> user-help@struts.apache.org
> 



	
		
__________________________________
Do you Yahoo!?
Yahoo! Tax Center - File online by April 15th
http://taxes.yahoo.com/filing.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic