我正在为具有各种安全要求的各种客户端编写一些api调用的插件框架,以收集各种特定于业务的数据。所有插件都实现IApiServiceEntryPoint
,如下所示:
public interface IApiServiceEntryPoint : IDisposable
{
/// <summary>
/// Gets the name of the API Plugin
/// </summary>
string Name { get; }
/// <summary>
/// Registers the assembly in the application, sets up the routes, and enables invocation of API requests
/// </summary>
void Register();
/// <summary>
/// Gets the routing namespace of the plugin
/// </summary>
string UrlNameSpace { get; }
/// <summary>
/// Validates the user is authorized to invoke the supplied method.
/// </summary>
/// <param name="methodName"></param>
bool IsAuthorized(string methodName);
/// <summary>
/// The user initiating the API call
/// </summary>
IPrincipal User { get; }
}
请注意IsAuthorized
方法。我的目的是允许插件确定特定的IPrincipal
是否有权调用具体类中的特定方法。使用字符串有效,但我宁愿更具体和可重构;例如,使用lambda表达式。
目前,我可以在我的API控制器中执行类似的操作:
[HttpGet]
public DateTime GetSystemTimeStamp()
{
if (IsAuthorized("GetSystemTimeStamp"))
{
return DateTime.UtcNow;
}
throw new AuthorizationException();
}
我想做的是这样的事情:
[HttpGet]
public DateTime GetSystemTimeStamp()
{
if (IsAuthorized(me => me.GetSystemTimeStamp))
{
return DateTime.UtcNow;
}
throw new AuthorizationException();
}
我如何在我的界面中声明,以及如何在IsAuthorized
方法中提取方法的名称以检查授权?
答案 0 :(得分:5)
你不需要lambda;您可以直接将该方法作为委托传递:
public bool IsAuthorized<T>(Func<T> method) {
string name = method.Method.Name;
}
if (IsAuthorized(GetSystemTimeStamp))
您希望接受的每个方法都需要单独的Func<,,,T>
重载;他们都可以简单地称为Delegate
的常用方法
或者,您可以只创建一个采用Delegate
的方法,然后在每个调用点显式创建一个委托。