• 0

Trying to Create a Method Signature I'm Happy With


Question

I'm trying to create a base interface / class that I am happy with that can accept a class type, request, and response. I can't quite get it structured the way I want it to be. I essentially want to have a helper assembly that will wrap any call on a given interface and perform things like timing, exception logging, etc. I want something similar to this:

var response = ServiceCaller.MakeServiceCall<Response, Request)>(SomeServiceClass.MyMethod(request));

return response;

 

I can't seem to quite get the code to be structured this way though. The closest I can get is:

public interface IWebServiceCaller<T>
        where T : class
    {
        R MakeServiceCall<R, C>(Expression<Func<T, Func<C, R>>> expression);
    }

 

public class WebServiceCaller<T>

 where T : class

{

         public R MakeServiceCall3<R, C>(Expression<Func<T, R>> expression, C request)
        {
            var exp = expression.Compile();
            ValidateRequest(request);
            var response = exp.Invoke(ServiceClass);

            return response;
        }

}

 

You have to pass the request object to be able to access it outside the expression it seems with this method though. I haven't used expressions that much I must admit. Is there something I'm missing here? I wish I could remove that extra C request parameter and still access the instance being passed in. If I change Expression<Func<T, R>> to Expression<Func<T, C, R>>, it gets even more awkward it seems.

 

Part of me is thinking I don't need the T, since my class doesn't really care about what type is being called. That could change method on the interface to just R MakeServiceCall3<R, C>, but then I still would need to pass the method to be called and an extra parameter for type C (like so: MakeServiceCall3<R, C>(serviceFuncDelegate, C request);

 

Maybe I'm trying to force this structure too much. I like the general idea of it, just can't get the code structured the way I would like.

1 answer to this question

Recommended Posts

  • 0

What's wrong with:

TReturn WrapRequest<TReturn>(Func<TReturn> f) {
     try {
         // start timing
         return f();
     }
    catch // etc.
    finally // log timing, etc.
}

Called as such:

 

WrapRequest(() => SomeServiceClass.MyRequest(request));

It's not clear to me what your requirements are, if this isn't satisfactory could you explain why?

 

If you need access to the request parameter then just pass it separately:

TReturn WrapRequest<TReturn, TParam>(Func<TParam, TReturn> f, TParam p) {
      // try-catch, time, log, do whatever you want with p, etc.
      return f(p);
}

WrapRequest(SomeServiceClass.MyRequest, request);

This is less flexible because the number of parameters is hardcoded; you'd need a separate overload for each different number of parameters.

This topic is now closed to further replies.
  • Posts

    • Apple: lets take our inspiration from Windows 7/Vista and call it innovative
    • Nice! My $100 refurbished iPad 8 that I bought last year for a small project (and still runs like new cuz it's been mostly in storage the past several months) will get this v26 upgrade. I'm definitely gonna scope out OS26 on this device before upgrading my also-supported refurbished iPhone SE 3rd Gen (only got it for the 5G UW support).
    • Hello, The separate discussion about VLC has been moved to its own thread at  Regards, Aryeh Goretsky  
    • Hello, I am guessing this is the result of using a third-party tweaking tool instead of changing things within Windows settings. Windows 11 has a decent set of configuration options for the display, but they tend to be scattered throughout the operating system due to fragmentation of product ownership/inconsistent standards being applied by Microsoft. There are a few places in Windows 11 where you can modify the various display settings in order to get them to your liking: Under Settings → System → Display you can stroll down to the Scale & layout section and change the Scale and Display resolution settings to whatever you prefer.  For the Scale option, you can click on the text box to choose between the various pre-populated settings.  If none of those are exactly what you are looking for, click on the caret ("") caret to open the Custom scaling setting (also available under Settings → Display → Custom scaling).  I would recommend this as an option of last resort as this can cause display issues in various programs. I strongly recommend using the screen's native Display resolution here; it should show up as the "(Recommended)" resolution.  If it does not, you may need to install your monitor's profile information file (basically, a device driver for your monitor) to get the correct setting. Another place to look at making changes to fonts is under Accessiblity → Text size.  There is a slider bar for changing the text size from 100% to 225% there. You can try making changes to the ClearType settings.  It's a little bit finer-grained than the others, but it may make the text easier to view on the display.  Run the ClearType Text Tuner (filename: CTTUNE.EXE) and go through the wizard. You may want to do this several times under different lighting conditions or times of the day to figure out what works best for you overall. Lastly, you may want to look into using a dedicated assistive screen technology program from a third-party.  Microsoft provides a Screen Magnifier and a Narrator for text-to-speech, but they provide only basic functionality, and you may find that a third-party program works a lot better.  The pros of this is that third-party assistive technology programs tend to work quite well under Windows; Microsoft has historically worked closely with third-party developers of assistive technologies.  The cons of this are that such tools tend to be on the expensive side, since they are often sold to schools, businesses, or paid for by insurance companies, not individuals. Regards, Aryeh Goretsky  
    • Totally agree with you. I think people, especially on tech sites, need to realize that they’re the minority. Microsoft isn’t going to waste time on things that, in the big picture, don’t matter to the majority.
  • Recent Achievements

    • Dedicated
      MadMung0 earned a badge
      Dedicated
    • Rookie
      CHUNWEI went up a rank
      Rookie
    • Enthusiast
      the420kid went up a rank
      Enthusiast
    • Conversation Starter
      NeoToad777 earned a badge
      Conversation Starter
    • Week One Done
      VicByrd earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      506
    2. 2
      ATLien_0
      267
    3. 3
      +FloatingFatMan
      257
    4. 4
      Edouard
      203
    5. 5
      snowy owl
      178
  • Tell a friend

    Love Neowin? Tell a friend!