2

Person以下に定義するように、自分のシステムから出力する機能を提供したいと考えてvCardいます。ユーザーにプライバシーオプションを提供するために、ユーザーは特定のプロパティを表示/非表示にするかどうかを選択できます。最も単純な形式では、ユーザーの選択肢を保持する別のテーブルが必要です。

configurator tableリフレクションを使用してこれを構築できるかどうか疑問に思っていました。以下のPersonモデルに示すように、カスタム属性でプロパティを装飾し、それらのプロパティを使用して、bool装飾されたすべてのプロパティのプロパティを持つモデルを構築および永続化できPersonます。

public class Person
{
    public string UserName { get; set; }
    public string FirstName { get; set; }

    [DisplayOnVCard]
    public string LastName { get; set; }

    [DisplayOnVCard]
    public string Email { get; set; }

    [DisplayOnVCard]
    public string MobilePhone { get; set; }
}

**[DisplayOnVCard]はカスタム属性です。*

これの終わりに、これに対応するデータベース内のテーブルを期待しています:

public class VCardConfigurator
{
    public bool LastName { get; set; }
    public bool Email { get; set; }
    public bool MobilePhone { get; set; }
}

これは、実際に巨大なエンティティとは何かを表すサンプルにすぎません。そのため、bool フィールドを各オプション プロパティに手動でマッピングすることは避けたいと考えています。

この問題のドメインは、たとえば、ソーシャル ネットワーキング サイトでのプライバシー設定の仕組みと非常によく似ていると思います。

これを入力している間、いずれプロパティの 1 つから属性を削除することになった場合、それがどのような影響を与える可能性があるかについて考えました。少し考える必要があります!

自己のためのさらなる読書:


完全に間違った道を疾走している可能性が非常に高いです。もしそうなら、そうアドバイスしてください!

4

1 に答える 1

1

#1 アップデート

属性はクラスレベルであるため、インスタンスの属性を追加または削除できるかどうかはわかりませんが、それらのプロパティ値は変更できます(インスタンスであるため)。

私の提案する解決策

各ユーザーのプライバシー以外のプロパティの列のみを含むテーブルをデータベースに作成することはできないため、「これに対応するデータベース内のテーブルが必要です」の意味がわかりません。

このマッピング専用のテーブル (「PrivacyMappings」テーブルとしましょう) が必要です。これらの列には、UserId、PropertyName、IsPrivate があります。

ユーザーが追加されると、すべてのプロパティがデフォルトのプライバシー設定でこのテーブルに追加されます (たとえば、すべてのプロパティはデフォルトで非プライベートです)。プロパティを繰り返し処理して追加し、あなたが言ったように挿入することができます。

エンティティ フレームワークで次のクラスを使用できます。

public class PrivacyMapping
{
public int UserId {get;set;}
public string PropertyName {get;set;}
public bool IsPrivate {get;set;}
}

ユーザーの追加時にデフォルトのプライバシー設定を追加する:

// retrieve user model properties.

foreach (property in properties)
{
//iterrate over the user Properties.
context.PrivacyMapping.Add(new PrivacyMapping(user.userId, propertyName, isPrivate);
}

context.SaveChanges()

これで、すべてのユーザーの非プライベート プロパティを次のように取得できます。

context.PrivacyMapping.Where(p=>p.UserId == user.id && !IsPrivate).Select(p=>p.PropertyName);

これで、必要な方法で情報を処理できるようになりました。

たとえば、c'tor でユーザー ID/オブジェクトを受け取り、許可されたプロパティの辞書を名前で保存する VCardItems クラスを作成できます。

public class VCardItems{

private Dictionary<string, object> properties{get;set;}

public VCardItems(User user)
{
// initiate values..
}
        public object this[string name] {
            get 
            { 
                if (properties.ContainsKey(name))
                {
                    return properties[name];
                }

                // A private property.
                return null;

            }
            set 
            {
                properties[name] = value;
            }
        }
    }

データの使用方法には他にもオプションがあります。たとえば、ActionFilter を使用してプライベート プロパティを null に設定したり、非プライベート データを HttpContext.Items ディクショナリに格納したりしますが、実際にはあなた次第です。

最初のメッセージ

詳細に入る前に、このクラスをどのように使用する予定なのだろうかと思います。

たとえば、ビュー (またはそれを処理するもの) が実行時に生成されたクラスを受け取る場合、どのように処理しますか?

このモデルが持つプロパティをどのように知ることができますか?

于 2012-09-27T16:11:35.153 に答える