2012-05-16 56 views
2

我想创建一个ServiceStack服务的自定义属性,我可以使用它来控制服务类中的每个方法。自定义属性到ServiceStack方法

这是我正在实现的属性类。

[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class , Inherited = false, AllowMultiple = false)] 
public class MyRequestFilterAttribute:RequestFilterAttribute 
{ 

    public string Provider { get; set; } 

    public MyRequestFilterAttribute(ApplyTo applyTo): base(applyTo) 
    { 
     this.Priority = (int) RequestFilterPriority.Authenticate; 
    } 

    public MyRequestFilterAttribute():this(ApplyTo.All) 
    { 

    } 

    public MyRequestFilterAttribute(ApplyTo applyTo, string provider): this(applyTo) 
    { 
     this.Provider = provider; 
    } 

    public MyRequestFilterAttribute(string provider): this(ApplyTo.All) 
    { 
     this.Provider = provider; 
    } 

    public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto) 
    {} 
} 

这是服务类

[MyRequestFilter(ApplyTo.All)] 
public class TodoService : RestServiceBase<Todo> 
{ 
    public TodoRepository Repository { get; set; }     
    public override object OnGet(Todo request) 
    { 
     if (request.Id == default(long)) 
      return Repository.GetAll(); 

     return Repository.GetById(request.Id); 
    } 
    public override object OnPost(Todo todo) 
    { 
     return Repository.Store(todo); 
    } 
    public override object OnPut(Todo todo) 
    { 
     return Repository.Store(todo); 
    } 
     [MyRequestFilter("Admin")] 
    public override object OnDelete(Todo request) 
    { 
     Repository.DeleteById(request.Id); 
     return null; 
    } 
    public object GetDetailsofALL() 
    { 
     return null; 
    } 
} 

我能够得到的方法来控制,当我放在类级别的属性。 即

[MyRequestFilter(ApplyTo.All)] 
public class TodoService : RestServiceBase<Todo>{} 

我所需要的是放置在方法级的属性,以及做一些验证,例如,只有管理员有权执行服务的这种方法的权利。 但是,当我把这个属性放在Delete方法中时,它不起作用,并且自定义过滤器属性没有被击中。只有类级属性调用起作用。

[MyRequestFilter("Admin")] 
public override object OnDelete(Todo request){} 

是否可以从方法级别设置权限/过滤器属性?如果是的话,我该如何实现呢?

回答

1

不,不可能将其添加到方法中。您可以在服务类或请求DTO添加它,并使用ApplyTo方法过滤器来告诉servicestack哪些方法应该适用于,例如:

[MyRequestFilter(ApplyTo.All)] 
[MyRequestFilter(ApplyTo.Delete, "Admin")] 
public class TodoService : RestServiceBase<Todo> { ... } 

您也可以参考[RequiredRole]的实施和[RequestPermission]属性的例子Request Filter attributes支持这一点。

+0

谢谢队友.. 我之前通过链接..但只是想知道是否有可能在方法级别做某种事情。 – Manek