Of course, you could make the dao implementation an *actual* singleton.

The purpose of the 'singleton' service model in hivemind is, as I
understand it, to avoid needless re-creation of objects when such
re-creation is not necessary, and NOT to provide the protection
features of a standard java singleton.  If that's correct than it's a
bit of a misnomer, IMHO.

If what you REALLY want is an object that is guaranteed to be a
singleton no matter what, than fall back on standard java and make it
a singleton.  You can still access the singleton using some other
hivemind service and return it.

It depends on what you want to say about your library:  if the
'proper' use is to bootstrap the registry to get the service (and the
DAO) then it may be fine to have the DAO be a simple POJO.  Failure to
access the DAO via hivemind is a misuse of the library and the user
gets whatever failures they deserve.  If, however, it is acceptable
(and/or expected) that the user will access the object outside of
hivemind you may want to make it a proper singleton.

As to the session issue -- yeah, I misunderstood.  The simple answer
is to just return SessionDAOImpl.Instance() -- assuming you made it an
instance.  In that scenario the request is unnecessary.  The exists()
method may be unnecessary too, I was just trying to sort of mimic the
functionality available in standard ASO usage.

On 3/16/06, Adam Zimowski <[EMAIL PROTECTED]> wrote:
> Thank you very much Mike.  I like the concept, and your point is right
> on the money. I want to force other developers to use Hivemind to
> obtain ISessionDAO, not the specific implementation.
>
> In your example my dao would be stored inside the session. Is there a
> reason for this? I would prefer it to be a singleton, and not create a
> session just to get the DAO. My session DAO is to provide session
> persistence in the clustered environment, I didn't mean it to live
> inside the session. I'm sorry if that may have been confusing, I could
> have used another dao name, like MemberDAO and IMemberDAO.
>
> Anyway, I will play with your example and try to change it so that it
> doesn't use the session.
>
> One last question. Let's assume I have it wired such that Hivemind
> retuns IMemberDAO or whatever other DAO interface I specify. If my DAO
> implementations live in some package as part of the application, what
> there to prevent other developers from doing inevitable:
>
> SessionDAO dao = new SessionDAO();
> MemberDAO dao = new MemberDAO();
> etc...
>
> I really would like to prohibit this kind of thing totally. There may
> be developers not familiar with IOC that would do this kind of thing,
> yet if it weren't possible they would eventually find the right way
> (the IOC way) to do this type of thing.
>
> Sincere Regards,
> Adam
>
> On 3/16/06, Mike Snare <[EMAIL PROTECTED]> wrote:
> > Try this...
> >
> > In hivemodule.xml:
> >
> > <service-point id="daoprovider" 
> > interface="com.yourcompany.ISessionDAOProvider">
> >    <invoke-factory>
> >       <construct class="com.yourcompany.impl.SessionDAOProviderImpl" />
> >    </invoke-factory>
> > </service-point>
> >
> > ISessionDAOProvider.java:
> >
> > public interface ISessionDAOProvider {
> >    public ISessionDAO getDAO();
> >    public boolean getDAOExists();
> > }
> >
> > SessionDAOProviderImpl.java:
> >
> > public class SessionDAOProviderImpl implements ISessionDAOProvider {
> >
> >    private static final String DAO_KEY = "DAO_KEY";
> >
> >    /**
> >     * HiveMind provides you with a proxy for the real request so that every 
> > time
> >     * you call a method on it it gets routed to the request that is 
> > associated
> >     * with the current thread.  magic...
> >     */
> >    private HttpServletRequest req;
> >
> >    public SessionDAOProviderImpl(HttpServletRequest req) {
> >       this._req = req;
> >    }
> >
> >    /**
> >     * retrieves the DAO from the session, creating it if it doesn't exist 
> > yet.
> >     */
> >    public ISessionDAO getDAO() {
> >       if (!exists()) {
> >          // ideally the implementation class would be specified 
> > externally...
> >          req.getSession().addAttribute(DAO_KEY, new SessionDAOImpl());
> >       } else {
> >          return (ISessionDAO) req.getSession().getAttribute(DAO_KEY);
> >       }
> >    }
> >
> >    public boolean getDAOExists() {
> >       return req.getSession().getAttribute(DAO_KEY) != null;
> >    }
> > }
> >
> > Wherever you need the ISessionDAO, just inject the daoprovider service
> > and call getDAO...
> >
> > It's not ideal because you are sort of rolling your own persistence,
> > but it achieves the goal of hiding the implementation of the dao, and
> > I don't know of another way to do that.
> >
> > -Mike
> >
> > On 3/16/06, Adam Zimowski <[EMAIL PROTECTED]> wrote:
> > > How could I do this? I don't know Hivemind very well, yet because it's
> > > integrated with Tapestry I highly prefer it over Spring IOC. Any
> > > chance you may have an example?
> > >
> > > On 3/16/06, Mike Snare <[EMAIL PROTECTED]> wrote:
> > > > By the way, if any tap developers are reading this, it would be great
> > > > if you could declare an interface for an ASO similar to the way you
> > > > can for a service...
> > > >
> > > > -Mike
> > > >
> > > > On 3/16/06, Mike Snare <[EMAIL PROTECTED]> wrote:
> > > > > That will work, but doesn't enforce your intent on other developers
> > > > > (they would be free to inject the ASO as a SessionDAO and not an
> > > > > ISessionDAO).  Perhaps a better way would be to create a service whose
> > > > > sole purpose would be to retrieve an instance of the ISessionDAO from
> > > > > the ApplicationStateManager, which can be auto-wired to your
> > > > > ISessionDAORetriever service.  Noone would then know the type.
> > > > >
> > > > > -Mike
> > > > >
> > > > > On 3/16/06, Adam Zimowski <[EMAIL PROTECTED]> wrote:
> > > > > > Silly me :-)  How simple and elegant !  I've been thinking in the
> > > > > > spring context, yet Tap/Hivemind make it so simple..
> > > > > >
> > > > > > Thanks!
> > > > > >
> > > > > > On 3/16/06, Kristian Marinkovic <[EMAIL PROTECTED]> wrote:
> > > > > > > hi Adam,
> > > > > > >
> > > > > > > @InjectState("sessionDAO")
> > > > > > > public abstract ISessionDAO getSessionDAO();
> > > > > > >
> > > > > > > works fine too; i'm using it with tapestry-spring
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >              "Adam Zimowski"
> > > > > > >              <[EMAIL PROTECTED]
> > > > > > >              .com>                                                
> > > > > > >       An
> > > > > > >                                         "Tapestry users"
> > > > > > >              16.03.2006 14:11           
> > > > > > > <tapestry-user@jakarta.apache.org>
> > > > > > >                                                                   
> > > > > > >    Kopie
> > > > > > >
> > > > > > >               Bitte antworten                                     
> > > > > > >    Thema
> > > > > > >                     an                  POJO dependency injection 
> > > > > > > (with
> > > > > > >              "Tapestry users"           interface) into TAP4 
> > > > > > > application
> > > > > > >              <[EMAIL PROTECTED]
> > > > > > >              karta.apache.org>
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Hi there,
> > > > > > >
> > > > > > > I'd like to inject my DAOs from Hivemind as an interface such 
> > > > > > > that my
> > > > > > > app is not aware of implementation. I only know I can do this:
> > > > > > >
> > > > > > > <contribution 
> > > > > > > configuration-id="tapestry.state.ApplicationObjects">
> > > > > > >  <state-object name="sessionDAO" scope="application">
> > > > > > >   <create-instance class="data.dao.SessionDAO"/>
> > > > > > >  </state-object>
> > > > > > > </contribution>
> > > > > > >
> > > > > > > Then, in my class I'd do:
> > > > > > >
> > > > > > > @InjectState("sessionDAO")
> > > > > > > public abstract SessionDAO getSessionDAO();
> > > > > > >
> > > > > > > I have a few problems with this:
> > > > > > >
> > > > > > > 1) I'd like to inject an interface ISessionDAO, not the concrete
> > > > > > > implementation.
> > > > > > >
> > > > > > > 2) Question: will Hivemind give me a singleton? I don't want my 
> > > > > > > DAO's
> > > > > > > be a bunch of short lived objects. I'd like to be sure they are
> > > > > > > singletons. I think they are because the scope is application, 
> > > > > > > but I'm
> > > > > > > not sure.
> > > > > > >
> > > > > > > 3) I'd like to be able to inject it to other POJOs, not just 
> > > > > > > Tapestry
> > > > > > > derived objects (pages, components, etc). I probably could use
> > > > > > > Registry object, but I really prefer to do this with annotations? 
> > > > > > > They
> > > > > > > are so elegant.. Does Hivemind has annotation support ?
> > > > > > >
> > > > > > > As always, I appreciate your help up front.
> > > > > > >
> > > > > > > Regards,
> > > > > > > Adam
> > > > > > >
> > > > > > > ---------------------------------------------------------------------
> > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > ---------------------------------------------------------------------
> > > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > > >
> > > > > > >
> > > > > >
> > > > > > ---------------------------------------------------------------------
> > > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > >
> > > > > >
> > > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to