의 내가 다음과 같습니다 서비스 인터페이스를 가지고 있다고 가정 해 봅시다 :이 코드에서 형식 유추가 작동하지 않는 이유는 무엇입니까?
public interface IFooService
{
FooResponse Foo(FooRequest request);
}
나는이 같은 서비스의 메소드를 호출 할 때 약간의 크로스 커팅 문제를 충족하고 싶습니다; 예를 들어, 통일 된 요청 로깅, 성능 로깅 및 오류 처리를 원합니다. 나의 접근 방식은 공통 기본 "메소드를 호출하고 그 주위에 다른 일을 처리 취하는 Invoke
방법 저장소 '클래스를하는 것입니다 내 기본 클래스는 다음과 같이 보입니다 :..
public class RepositoryBase<TService>
{
private Func<TService> serviceFactory;
public RepositoryBase(Func<TService> serviceFactory)
{
this.serviceFactory = serviceFactory;
}
public TResponse Invoke<TRequest, TResponse>(
Func<TService, Func<TRequest, TResponse>> methodExpr,
TRequest request)
{
// Do cross-cutting code
var service = this.serviceFactory();
var method = methodExpr(service);
return method(request);
}
}
이 잘 작동을하지만 코드 청소기를 만드는 내 모든 목표는 그 형식 유추가 예상대로 작동하지 않는 사실에 의해 방해된다 예를 들어, 나는 이런 방법을 쓰는 경우 :. 나는이 컴파일 오류가
public class FooRepository : BaseRepository<IFooService>
{
// ...
public BarResponse CallFoo(...)
{
FooRequest request = ...;
var response = this.Invoke(svc => svc.Foo, request);
return response;
}
}
을 :
The type arguments for method ... cannot be inferred from the usage. Try specifying the type arguments explicitly.
분명히, 나는 내 전화를 변경하여 문제를 해결할 수 있습니다
var response = this.Invoke<FooRequest, FooResponse>(svc => svc.Foo, request);
하지만이를 방지하고 싶습니다. 형식 유추를 활용할 수 있도록 코드를 다시 작성하는 방법이 있습니까?
편집 :
나는 또한 이전 방식은 확장 방법을 사용하는 것을 언급해야한다; 이것에 대한 형식 유추는 일 :
public static class ServiceExtensions
{
public static TResponse Invoke<TRequest, TResponse>(
this IService service,
Func<TRequest, TResponse> method,
TRequest request)
{
// Do other stuff
return method(request);
}
}
public class Foo
{
public void SomeMethod()
{
IService svc = ...;
FooRequest request = ...;
svc.Invoke(svc.Foo, request);
}
}
나는 본다; 그건 의미가 있습니다. – Jacob