提案

2012-04-25 30 views
1

私はそれが許認可システムだのオーバーホールを必要とするアプリケーションを持っています。提案

このアプリケーションは確保必要「実体」の2種類があります簡単です、彼らはただ彼らに内の領域へのアクセス権を与える役割を果たしている

  • ユーザー
  • 会社

ユーザーアプリケーションでは、データは変更されません。管理(製品を所有している現在、単に「マスター」会社)、パートナー(製品の再販業者)と標準(単に製品を使っている人) -

企業は、3種類のいずれかになります。

製品はまた、リセラーは別の名前の下で製品を販売することができますので、企業の「グループ」の概念がありますが、一度にすべてのデータを表示できるようにする必要があります。したがって、各企業は常にグループに属し、各グループは企業によって所有されています。データを照会する場合

、私はいくつかの要件があります。会社Aの販売代理店に属するユーザがデータを照会する場合

  • を、リセラーが所有するすべてのグループ内のすべての企業がいる場合
  • を表示する必要があります標準の会社Bに属するユーザは、彼らはすべてが
  • 最後に、ニーズを示しています実際のデータをフィルタリングするために確認する必要があり、管理会社Cに属するユーザがデータを照会する場合は、彼らが唯一の彼らの情報
  • を確認する必要があり、データを照会します会社の種類別 - 管理会社は今、標準の企業よりも多くの情報

を参照してくださいリセラー、より多くのデータを参照して、現在のシステムは、実際にこれのほとんどを行いますが、それは多くのです:かなり醜いです

List<int> groups; 
if(CompanyType == CompanyType.Reseller){ 
    groups = [some list of groups] 
}else{ 
    .... 
} 

とエラーを起こしやすい。あなたが利用可能なツールを知っているように、我々は、亜音速、WCF(システム全体がRESTインターフェースで設計されている)、PostSharp、およびC#を使用している

誰でも制限が適切かつ自動的に設定されていることを確認するためのフレームワークレベルでこのレベルの詳細(基本的に行と列)との許可を実装するための良い方法を提案することはできますか?

答えて

0

私は同様の問題に取り組みました。基本的に私の擬似アルゴリズムは:

IEnumerable<MyData> allDatas = DataAccessLayer.GetDatas(); 
IEnumerable<MyData> filteredDatas = RuleEngine.Filter(allDatas); 
// filteredDatas contains only the datas that the user is authorized to view 

最初に、私は例えばデータベースからすべての製品を取得しました。それからビジネスルールでフィルタリングします。おそらくRuleEngine.Filterにいくつかのパラメータを追加する必要があります:現在のユーザと、場合によってはコンテキスト情報です。

20個の製品を得るために、あなたはこのようないくつかのコードを書くことができますが:

IDataReader reader = GetReader(); 
var products = new List<Product>(); 
while(reader.Read() && products.Count < 20) 
{ 
    var product = BuildProduct(reader); 
    if(RuleEngine.Filter(new Product[] { product }).Any()) 
     products.Add(product); 
} 
+0

しかし、パフォーマンスヒットのどのような種類を紹介していますか?もし私が100,000レコードのテーブルを持っているなら、可能であればデータベースレベルでそれをフィルタリングしたいのですが... – jvenema

+0

10万レコードをロードするシナリオがありますか?おそらく、たとえば、製品の場合は、カテゴリやその他の基準でフィルタリングします。 – schglurps

+0

これは単なるトップ20フィルタなので、そこに制限するクエリがあります。それ以外の場合は、トップXをクエリして、フィルタが20未満にならないようにしてください:) – jvenema