Thanks all for the suggestions,
Each has its own merits, however I can't see one solution that would solve
the problem.
Spring.Net will inject a new object at each call, and will dispose the
object when it goes out of scope at the end of it's life.
For the record I feel dirty every time I have to write ,
public IPricingService PricingService { private get; set;}
using(PricingService){
}
it feels wrong, but thats how spring is configured here.
I think I will have to use a Session/Context type approach,
Cheers.
Davy,
"Always code as if the guy who ends up maintaining your code will be a
violent psychopath who knows where you live."
- Martin Golding
On Tue, Jan 25, 2011 at 09:39, James Chapman-Smith
<[email protected]>wrote:
> Hi David,
>
>
>
> It’s easy to force developers to call Dispose but your library calls must
> use a particular signature.
>
>
>
> Given an interface definition like so:
>
>
>
> public interface IPricingService : IDisposable
>
> {
>
> IEnumerable<IPrice> GetPrices(int @ref, DateTime date,
> PricingProviders pricingProviders);
>
> }
>
>
>
> Implement the service like this:
>
>
>
> public class PricingService : IPricingService
>
> {
>
> private PricingService();
>
>
>
> public static T Using<T>(Func<IPricingService, T> func)
>
> {
>
> using (IPricingService pricingService = new PricingService())
>
> {
>
> return func(pricingService);
>
> }
>
> }
>
>
>
> public IEnumerable<IPrice> GetPrices(int @ref, DateTime date,
> PricingProviders pricingProviders) { ... }
>
>
>
> public void Dispose() { ... }
>
> }
>
>
>
> Then your developers call the service like this:
>
>
>
> var prices = PricingService.Using(ps => ps.GetPrices(10, DateTime.Now,
> PricingProviders.All));
>
>
>
> The only way to access the service is through the static Using function
> that calls dispose when the function is done.
>
>
>
> You can still use closures to get at the IPricingService instance if need
> be, but it will be disposed when the function finishes.
>
>
>
> How’s that?
>
>
>
> Cheers.
>
>
>
> James.
>
>
>
> *From:* [email protected] [mailto:
> [email protected]] *On Behalf Of *David Rhys Jones
> *Sent:* Monday, 24 January 2011 23:08
>
> *To:* ozDotNet
> *Subject:* Forcing Dispose to be Called.
>
>
>
>
> Hi all,
>
> Background:
>
> I've got a service connection that is limited to 5 logins, (internal app
> written in another dept, Java Webservice not WCF compatible.), I've
> implemented a library (C# 3.5) that calls this and a number of different
> services to provide a coherent data source for our Excel (2003)
> applications.
> In my dispose, I clean everything up correctly, connections are closed,
> webservice is disposed etc.
>
> Problem:
>
> I need to find a way to force the developpers in my team and in the other
> teams that use my library to call the Dispose method after each use of the
> library.
>
> Is there a pattern or does anyone have an idea, how I can put a limit on
> how long the object can be used for?
> I can think of some really kludgy ways using elapsed time and throwing an
> exception.
>
>
>
> Examples:
>
>
> Good : all calls are closed, webservice is disposed, sockets closed etc.
>
> // Spring.Net
> public IPricingService PricingService { private get; set; }
>
> public IEnumerable<IPrice> GetPrices(int ref, DateTime date)
> {
> using (PricingService)
> {
> return
> PricingService.GetPrices(ref,date,PricingProviders.All);
> }
> }
>
>
> Bad : object is not closed, open sockets and the login used for this call
> will block until the webservice timeout.
>
> // Spring.Net
> public IPricingService PricingService { private get; set; }
>
> public IEnumerable<IPrice> GetPrices(int ref, DateTime date)
> {
> return
> PricingService.GetPrices(ref,date,PricingProviders.All);
> }
>
>
> thanks
>
> Davy,
>
>
> "Always code as if the guy who ends up maintaining your code will be a
> violent psychopath who knows where you live."
>
> - Martin Golding
>
>
>