Re: Creating a "public only" constructor

Frans Bouma <[email protected]> Mon, 6 Apr 2009 10:56:29 +0200
Newsgroups gmane.comp.windows.devel.dotnet.advanced
Message-ID <006d01c9b695$9360b260$ba221720$@nl>
> If it's a ORM code generation, you might want to switch to a cool LINQ-
> enabled ORM tool built in the Netherlands (wink)...

	Heh, great minds think alike ;) :P

		FB

> 
> Thanks,
> 
> Shawn Wildermuth
> http://wildermuth.com
> https://agilitrain.com
> Microsoft MVP (C#), MCSD.NET, Author and Speaker
> 
> The Silverlight Tour is coming to a city near you!
> 
> 
> -----Original Message-----
> From: Discussion of advanced .NET topics.
> [mailto:[email protected]] On Behalf Of Frans Bouma
> Sent: Monday, April 06, 2009 4:34 AM
> To: [email protected]
> Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor
> 
> > If it were a new design yes - but it's not. The code generation has
> allowed
> > for this separate server capability, but I fear it cannot be utilised
> fully
> > because the code was historically never designed to work with it, and
> > without hundreds of hours of trawling through the current codebase it
> can't
> > be successfully changed to a class factory type scenario.
> 
> 	If the code generation was template based, you might be able to do
> something about it, but I'm not sure how it's generated.
> 
> 	Refactoring the code might be simpler than you might think. As is't
> the default ctor you're worried about, it's easy to spot with
> search/replace. if you load the codebase into vs.net, and do find/replace
in
> files, and replace the call to the empty ctor to a call to a factory, the
> only thing that's to solve after that is the references to the right
> namespace where the factory is located. You can also spot calls to the
> second ctor with a simple regex in the find/replace dialog in vs.net.
> 
> 	But I still don't fully understand what the order is in which the
> ctors are used. As I understand it, it seems that if I want to instantiate
> an invoice, I use the empty ctor of Invoice. And if I want to instantiate
an
> invoiceitem, I use the parameter-using ctor in invoice, and you want to
> prevent that the invoiceitem empty ctor is used, correct?
> 
> 	If you replace calls to both ctors to a call to a factory and make
> both ctors internal, you have full control over when what is called.
> However, I am a bit puzzled why the empty ctor is supposed to be public if
> instantiating an invoiceitem is always dependent on the invoice itself (as
> instantiating it on the same server as the invoice is always the best
idea)
> 
> 		FB
> 
> >
> > Dino
> >
> > -----Original Message-----
> > From: Discussion of advanced .NET topics. [mailto:ADVANCED-
> > [email protected]] On Behalf Of Frans Bouma
> > Sent: Monday, 06 April 2009 19:57
> > To: [email protected]
> > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor
> >
> > Dean,
> >
> > I have the feeling the concern whether OTHER objects are created on
> > the
> same
> > server is not the concern of the class you want to instantiate but the
> > concern of a repository or other object. I know you're facing a large
> > pile of code, but you have to make a change somewhere anyway. I'd
> > factor out
> this
> > concern from this class and create factories to produce the proper
> instances
> > on the right server/service.
> >
> > 	FB
> >
> > > Hmm - yeah. Not a bad idea... but would mean that only the Business
> > Services
> > > layer would ever compile in that release, and everything else would
> fail.
> > >
> > > -----Original Message-----
> > > From: Discussion of advanced .NET topics. [mailto:ADVANCED-
> > > [email protected]] On Behalf Of Dave Jones
> > > Sent: Monday, 06 April 2009 19:31
> > > To: [email protected]
> > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor
> > >
> > > Wrap the constructor in a #if release?   Then it won't be available in
> > > debug?
> > >
> > > Dave
> > >
> > >
> > >
> > >
> > > -----Original Message-----
> > > From:         Dean Cleaver <[email protected]>
> > >
> > > Date:         Mon, 6 Apr 2009 16:02:43
> > > To: <[email protected]>
> > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor
> > >
> > >
> > > The second constructor allows you to create a business services
> > > object on
> > a
> > > different connection to the default - so I can specifically create
> > business
> > > services objects connected to 2 different servers from within the
> > > same application. I then want to ensure that if I create an Invoice
> > > object on a given server, than any InvoiceItems it creates are on
> > > the same server,
> > which
> > > would be done by using the second constructor. If a developer
> > > accidentally uses the default constructor, it could make a mess of
> > > the
> > system.
> > >
> > > -----Original Message-----
> > > From: Discussion of advanced .NET topics. [mailto:ADVANCED-
> > > [email protected]] On Behalf Of Shawn Wildermuth
> > > Sent: Monday, 06 April 2009 15:55
> > > To: [email protected]
> > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor
> > >
> > > I don't think you can.  Can you explain why you want to protect it
> > > from internal classes?
> > >
> > > Thanks,
> > >
> > > Shawn Wildermuth
> > > http://wildermuth.com
> > > https://agilitrain.com
> > > Microsoft MVP (C#), MCSD.NET, Author and Speaker
> > >
> > > The Silverlight Tour is coming to a city near you!
> > >
> > >
> > > -----Original Message-----
> > > From: Discussion of advanced .NET topics.
> > > [mailto:[email protected]] On Behalf Of Dean
> > > Cleaver
> > > Sent: Sunday, April 05, 2009 11:42 PM
> > > To: [email protected]
> > > Subject: [ADVANCED-DOTNET] Creating a "public only" constructor
> > >
> > > Hey, anyone know if you can do this with attributes or something? I
> > > want
> > to
> > > have 2 public constructors:
> > >
> > > public ClassName()
> > > {
> > > }
> > >
> > > public ClassName(some param)
> > > {
> > > }
> > >
> > > I want both publically accessible, but I want the default one
> > *inaccessible*
> > > internally. Can that be done?
> > >
> > > Dino
> > >
> > > ===================================
> > > View archives and manage your subscription(s) at
> > > http://peach.ease.lsoft.com/archives
> > >
> > > ===================================
> > > View archives and manage your subscription(s) at
> > > http://peach.ease.lsoft.com/archives
> > >
> > > ===================================
> > > View archives and manage your subscription(s) at
> > > http://peach.ease.lsoft.com/archives
> > >
> > > ===================================
> > > View archives and manage your subscription(s) at
> > > http://peach.ease.lsoft.com/archives
> >
> > ===================================
> > View archives and manage your subscription(s) at
> > http://peach.ease.lsoft.com/archives
> >
> > ===================================
> > View archives and manage your subscription(s) at
> > http://peach.ease.lsoft.com/archives
> 
> ===================================
> View archives and manage your subscription(s) at
> http://peach.ease.lsoft.com/archives
> 
> ===================================
> View archives and manage your subscription(s) at
> http://peach.ease.lsoft.com/archives

===================================
View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives