2016-10-20 3 views
2

メッセージベースのデザインにビジネスロジックを配置するためのベストプラクティスは何ですか?(ServiceStack)メッセージベースのアーキテクチャにおけるビジネスロジックの場所

私のapiを構築するためにservicestackを使用しています。

The wikiは、サービスを処理するサービスの代わりにRequiredRole属性をメッセージに配置する例を示しています。

ある意味、この[RequiredRole]/[Authenticate]はメッセージに添付されているビジネスロジック/セキュリティです。

具体例

私は DeleteAddressメッセージ追加することになり、たとえば

言った:

public class DeleteAddress : IReturn<bool> 
{ 
    public int AddressId { get; set; } 
} 

をしかし、これはするために適切に私がリンクされているのAddressId ManageAllAddressesまたはその管理者の役割、権限のいずれかを確認したい確保このユーザーに(おそらく、セッション中、多分dbコールを通して)。

どうすればこのようなことになるのですか?

命題

次のコードは、良い習慣ですし、もしそうならどのように私はそれを実装するのでしょうか?私たちはあなたが適用するすべての操作にまたは個々のメソッドに適用するためにどちらかのサービスクラスに注釈を付けることができた代わりに、あなたのサービスの実装クラスに注釈を付けることをお勧めしたいので

[RequiredRole("Admin")] 
[RequiredPermission("ManageAllAddresses ")] 
[RequiredAddressLinkedToAccount] 
public class DeleteAddress : IReturn<bool> 
{ 
    public int AddressId { get; set; } 
} 
+0

wx上の古いドキュメントのポインタの場合は、一致するように更新します – mythz

答えて

1

ServiceStackの勧告は、依存関係のないあなたServiceModelを維持することですちょうどその動作に、例えば:

[RequiredRole("Admin")] 
public class AddressServices : Service 
{ 
    [RequiredPermission("ManageAllAddresses ")] 
    [RequiredAddressLinkedToAccount] 
    public object Any(DeleteAddress request) 
    { 
    } 
} 

ServiceStackはレスポンスDTOは、一般的である、参照型を返すために、あなたのサービスを必要とするだけでなく、することができますのでご注意ください例えば、string

public class DeleteAddress : IReturn<string> 
{ 
    public int AddressId { get; set; } 
} 
0

この質問を終了するにはリクエストフィルタを作成してサービスに追加することができました。

AuthenticateAttributeから継承するか、RequestFilterAttributeから直接継承します。

public class RequiredAddressLinkedToAccount : AuthenticateAttribute 
{ 
    public RequiredRoleAttribute(ApplyTo applyTo) 
    { 
     this.ApplyTo = applyTo; 
     this.Priority = (int)RequestFilterPriority.RequiredRole; 
    } 



    public override void Execute(IRequest req, IResponse res, object requestDto) 
    { 
     var dto = requestDto as ILinkedToAccount; 
     var session = req.GetSession(); 
     if(dto.AccountId == session.Id) 
      return; //we dont want anything to be blocked if the account Id is there. 

     //Implement like RequireRoleAttribute 
     if (DoHtmlRedirectIfConfigured(req, res)) 
      return; 

     res.StatusCode = (int)HttpStatusCode.Forbidden; 
     res.StatusDescription = "Address does not belong to you"; 
     res.EndRequest(); 

    } 
} 
関連する問題