0

私はクラスのフレームワークを持っています。各クラスはいくつかのエンティティを表し、基本的な静的メソッド(Add、Get、Update、およびDelete)があります。

オブジェクトをインスタンス化せずに何らかのアクションを実行できるようにするため、このメソッドは静的になりました。たとえば、オブジェクトを追加するには、Foo.Add(foo)を実行する必要があります。

ここで、クラスごとに別のフレームワークから呼び出されるメソッドをいくつか用意したいと思います。ただし、このメソッドの機能は同じです。たとえば、オブジェクトが存在するかどうかを確認し、存在しない場合は作成し、そうでない場合は更新します。

それを実装するための最良のアプローチは何ですか?

すべてのクラスでこのように行う必要があります:

例えば:

public void DoSomethingWithFoo(Foo foo)
{
    if (Foo.Get(foo.id) != null)
        Foo.Update(foo);
    else
        Foo.Add(foo);
}

public void DoSomethingWithBar(Bar bar)
{
    if (Bar.Get(bar.id) != null)
        Bar.Update(bar);
    else
        Bar.Add(bar);
}

それとも、InvokeMemberを使用してそれを行う方が良いですか(すべてのコードを1か所にまとめるという考えによる)?

例えば:

   public void DoSomethingWithFoo(Foo foo)
   {
       DoSomethingWithObject(foo);
   }  

   private void DoSomethingWithObject(object obj)
    {
        Type type = obj.GetType();

        object[] args = {type.GetProperty("ID").GetValue(obj, null)};
        object[] args2 = { obj };
        if (type.InvokeMember("Get", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args) != null)
        {
            type.InvokeMember("Update", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2);
        }
        else
        {
            type.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2);
        }
    }

どのアプローチがより良く、よりクリーンですか?または多分あなたは別のアプローチを提案しますか?

ありがとう

4

1 に答える 1

0

良い。

つまり、最初に、独自のエンティティ フレームワークを作成してLLBLGenのようなものを使用しないでください。

第二に、そのアドバイスを無視するなら、次のようなスーパークラスが必要です。

public abstract class SavableBase
{
  protected abstract void Add ();
  protected abstract void Update ();

  public void Save ()
  {
     if( !saved ){
        Add();
     } else {
        Update();
     }
  }
}

そして、それらのメソッドを適切に実装します。

于 2009-08-17T09:06:13.277 に答える