2012-05-16 4 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

Спасибо mate .. Я прошел через ссылки раньше .. но просто хотел узнать, можно ли вообще что-то делать с уровня метода. – Manek

Смежные вопросы