[.NET] Func met 1 parameter, hoe parameter aan te roepen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:08

Haan

dotnetter

Topicstarter
Ik heb in een webservice een generieke RequestHandler functie om alle webmethods mee af te handelen:

C#:
1
2
3
4
5
public T RequestHandler<T>(RequestBase request, Func<RequestBase, T> action) where T : ResponseBase, new()
{
    // logging, error handling, e.d. weggelaten ;)
    return action.Invoke(request);
}


Dit roep ik bijv op deze manier aan:
C#:
1
2
3
4
5
6
7
8
9
public GetNawResponse GetNaw(GetNawRequest request)
{
    return RequestHandler(request, r => GetNawInternal(request));
}

private GetNawResponse GetNawInternal(GetNawRequest request)
{
    // implementatie
}


edit:
(extra info):
De inhoud van de request parameter wordt in de RequestHandler gelogd

Nu werkt dit opzich wel, maar zoals je ziet geef ik nu 2x de request door, omdat ik niet kan vinden hoe ik die parameter uit de Func te pakken krijg.. Indexing op de action werkt iig niet, Visual Studio weet dan wel te vertellen dat er een 'arg' van type RequestBase inzit, maar ik krijg het er niet uit ;( Op MSDN ook geen goed voorbeeld kunnen vinden, dus hopelijk weet iemand hier het wel :)

[ Voor 4% gewijzigd door Haan op 21-12-2011 09:34 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is nog vroeg dus snap niet helemaal wat je wil, maar wil je eigenlijk niet gebruik maken van een Expression i.p.v. een Func?

Wacht even, wil je niet het volgende
C#:
1
2
3
4
5
public T RequestHandler<T>(RequestBase request, Func<RequestBase, T> action) where T : ResponseBase, new()
{
    // logging, error handling, e.d. weggelaten ;)
    return action(request);
}

C#:
1
2
3
4
5
6
7
8
9
public GetNawResponse GetNaw(GetNawRequest request)
{
    return RequestHandler(request, GetNawInternal);
}

private GetNawResponse GetNawInternal(GetNawRequest request)
{
    // implementatie
}


o.i.d.?

[ Voor 65% gewijzigd door Woy op 21-12-2011 09:34 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:08

Haan

dotnetter

Topicstarter
Ja dat is precies wat ik wil!

Echter wil dat nog niet helemaal lukken.
"return RequestHandler(request, GetNawInternal)"
geeft een error
Expected a method with 'GetNawResponse GetNawInternal(RequestBase)' signature
wat dus vreemd is, want mijn GetNawRequest erft netjes van RequestBase..

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • alwinuzz
  • Registratie: April 2008
  • Laatst online: 14:10
Heb je niet nog meer type args nodig?
C#:
1
2
3
4
5
6
public TResponse RequestHandler<TRequest, TResponse>(TRequest request, Func<TRequest, TResponse> action) 
    where TRequest : RequestBase  where TResponse : ResponseBase, new() 
{ 
    // logging, error handling, e.d. weggelaten ;) 
    return action(request); 
}

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
@alwinuzz: Ah er zit inderdaad een verschil tussen het request en response type, dus dat zal sowieso niet in 1 type parameter kunnen

[ Voor 74% gewijzigd door Woy op 21-12-2011 09:47 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:08

Haan

dotnetter

Topicstarter
alwinuzz schreef op woensdag 21 december 2011 @ 09:44:
Heb je niet nog meer type args nodig?
C#:
1
2
3
4
5
6
public TResponse RequestHandler<TRequest, TResponse>(TRequest request, Func<TRequest, TResponse> action) 
    where TRequest : RequestBase  where TResponse : ResponseBase, new() 
{ 
    // logging, error handling, e.d. weggelaten ;) 
    return action(request); 
}
_/-\o_ Dan werkt dit inderdaad!
C#:
1
return RequestHandler(request, GetNawInternal);

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • alwinuzz
  • Registratie: April 2008
  • Laatst online: 14:10
Cool :)

Ik dacht "daar moet toch iets ingebouwds voor zijn, in WCF elke method wrappen?"
Maar na wat gegoogle lijkt dit toch de makkelijkste oplossing.

(Ik gebruik zelf Agatha voor WCF en daar is alles anders.
Edit: en beter! 8) )

[ Voor 3% gewijzigd door alwinuzz op 21-12-2011 10:03 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 07-07 14:42
Agatha gebruik ik ook veel voor dit soort dingen. Gewoonweg een stuk handiger dan zelf zoiets bouwen.

Overigens vroeg ik me even af waarom je niet gewoon:

C#:
1
2
3
4
5
6
7
8
9
10
 public T RequestHandler<T>(Func<T> action) where T : ResponseBase, new()
        {
            // logging, error handling, e.d. weggelaten ;)
            return action.Invoke();
        }

        public GetNawResponse GetNaw(GetNawRequest request)
        {
            return RequestHandler(() => GetNawInternal(request));
        }


deed. Maar je wilt natuurlijk de request param loggen :P

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:08

Haan

dotnetter

Topicstarter
D-Raven schreef op woensdag 21 december 2011 @ 10:00:
Agatha gebruik ik ook veel voor dit soort dingen. Gewoonweg een stuk handiger dan zelf zoiets bouwen.

Overigens vroeg ik me even af waarom je niet gewoon:

C#:
1
2
3
4
5
6
7
8
9
10
 public T RequestHandler<T>(Func<T> action) where T : ResponseBase, new()
        {
            // logging, error handling, e.d. weggelaten ;)
            return action.Invoke();
        }

        public GetNawResponse GetNaw(GetNawRequest request)
        {
            return RequestHandler(() => GetNawInternal(request));
        }


deed. Maar je wilt natuurlijk de request param loggen :P
Ik wil inderdaad de request loggen en valideren

Ik kende Agatha trouwens niet, maar het lijkt zo te zien behoorlijk op wat ik nu zelf heb gebouwd :X Daar gaan we zeker nog eens naar kijken bij het opzetten van een volgend project, voor dit project is het net wat te laat.

Kater? Eerst water, de rest komt later

Pagina: 1