派生クラスのこれらのメソッドを、基底クラスのメソッドと組み合わせて組み合わせることはできますか?

私はこのような方法があります:

   public void AddOrUpdate(Product product)
    {
        try
        {
            _productRepository.AddOrUpdate(product);
        }
        catch (Exception ex)
        {
            _ex.Errors.Add("", "Error when adding product");
            throw _ex;
        }
    }


    public void AddOrUpdate(Content content)
    {
        try
        {
            _contentRepository.AddOrUpdate(content);
        }
        catch (Exception ex)
        {
            _ex.Errors.Add("", "Error when adding content");
            throw _ex;
        }
    }

さらに、渡されたクラスだけが異なるメソッドがあります。

派生クラスごとにメソッドを繰り返すのではなく、基本クラスでこれらのメソッドをコーディングできる方法はありますか?私はジェネリックスに基づいて何かを考えていましたが、実装する方法がわからず、_productRepositoryを渡す方法もわかりません。

ここでは_productRepositoryと_contentRepositoryが定義されています:

    private void Initialize(string dataSourceID)
    {
        _productRepository = StorageHelper.GetTable(dataSourceID);
        _contentRepository = StorageHelper.GetTable(dataSourceID);
        _ex = new ServiceException();
    }
2
エンティティフレームワークを使用しない
追加された 著者 Samantha J T Star,
Entity Frameworkを使用していますか?
追加された 著者 Stéphane Bebrone,

2 答え

はい、できます。

インターフェイスと継承を使用するのが簡単な方法です。タイト結合

もう一つの方法は依存性注入です。カップルを失い、好ましい。

さらに別の方法は、ジェネリックスを次のように使用することです。

public void AddOrUpdate(T item ,V repo) where T: IItem, V:IRepository
{ 
  repo.AddOrUpdate(item)
}


class Foo
{
    IRepository _productRepository;
    IRepository _contentRepository

    private void Initialize(string dataSourceID)
    {
        _productRepository = StorageHelper.GetTable(dataSourceID);
        _contentRepository = StorageHelper.GetTable(dataSourceID);
        _ex = new ServiceException();
    }

    public void MethodForProduct(IItem item)
    {
       _productRepository.SaveOrUpdate(item);
    }

    public void MethodForContent(IItem item)
    {
       _contentRepository.SaveOrUpdate(item);
    }

}

// this is your repository extension class.
public static class RepositoryExtension
{

   public static void SaveOrUpdate(this IRepository repository, T item) where T : IItem
   {
      repository.SaveOrUpdate(item);
   }

}

// you can also use a base class.
interface IItem
{
   ...
}

class Product : IItem
{
  ...
}

class Content : IItem
{
  ...
}
5
追加された
私は答えを更新しました。
追加された 著者 DarthVader,
@AllanChuaありがとう。私は依存性注入を好む。それははるかに明確で、テスト可能であり、疎結合しています。
追加された 著者 DarthVader,
ジェネリックと呼ぶ方法の例を教えてもらえますか?また、TとVの意義は何ですか?
追加された 著者 Samantha J T Star,
これは良い答えです@DarthVader
追加された 著者 Allan Chua,
@DarthVader私は、Dependency InjectionがWPFとSilverlightでうまくいくと思います。
追加された 著者 Allan Chua,

Try to use Generic Methods There dude and implement it on your base class you could try this link: http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx

1
追加された