2016-12-20 17 views
2

私は、データベース移行のためのベースとして、次のabstract classを使用して考える:同期または非同期メソッド

using System.Threading.Tasks; 

public abstract class MigrationBase 
{ 
    public abstract string Name { get; } 
    public abstract string Description { get; } 
    public abstract int FromVersion { get; } 
    public abstract int ToVersion { get; } 
    public abstract void Apply(); 
    public abstract Task ApplyAsync(); 
} 

、具体的な移行がために書かれる下層データベース・システムに応じて、それが作ることvoid ApplyまたはTask ApplyAsyncメソッドを実装する方が意味があります。私は、次のオプションを参照してください。

  1. 私はちょうど私が「例50%で、」それをoneまたはthe otherの方法のいずれかで間違った操作を行うために、具体的な移行を実装する開発者を強制的に、両方の抽象メソッドの1つを有することを決定した場合。
  2. 両方の抽象メソッドを持つことに決めたら、データベースシステムが両方の可能性を提供していないときはいつでも間違っています。
  3. MigrationBase,SyncMigrationBaseおよびAsyncMigrationBaseを持ち、どこでも型キャストを使用しても私にとっては妥当ではないようです。
  4. 私は現在欠けていますか?

今、あなたは、ADO.Netは、ほとんどの場合、同期および非同期メソッドとを提供していますデータベースアダプタは両方のバリアントを提供するので、私はちょうどのオプション2を選択することができますと言うかもしれません。あなたがADO.Netなしでもっと一般的な問題を念頭に置いて見れば、より良い解決策がありますか?
私がオプション2を選択した場合、Task ApplyAsyncの事前実装バージョンを、System.IO.Stream.ReadAsyncと同じように、スティーブン・トゥブが書いたものを考慮して提供する必要がありますか?はいの場合は、他に何に注意を払う必要がありますか?

+0

それでは、私は 'bool'プロパティ' SupportsSync'と 'SupportsAsync'を必要とします。これは良いデザインとは思えません。 –

+0

または、プロパティなし:私は主な機能を使うとは思わないクラスは多くの場合例外がスローされるはずです。そのため、try-catch-blocksでどのバリアントを使用するかを決定するだけです。 –

答えて

6

ApplyAsyncのみを使用し、他の方法を削除してください。

私は、ユーザーがANを実装する必要がある場合、私は間違っているいずれかまたは他の方法

でそれを行うために、具体的な移行を実装する開発者を強制的に、両方の抽象メソッドの1つを有することを決定した場合asyncメソッドをインターフェイスまたは抽象クラスから取得する必要がありますが、すべてを同期して実行する必要があります。asyncメソッドをTaskに置き換えても問題ありません。

あなたのコードは、常に非同期であるかのように呼び出しを実行します。

抽象メソッドを両方とも使用することに決めた場合、データベースシステムが両方の可能性を提供していない場合は、間違っています。

これは正しいことですが、両方の方法を公開するのが悪い選択肢です。

MigrationBaseSyncMigrationBaseAsyncMigrationBaseを持つ、どこでも型キャストを使用すると、私には合理的なようではありません。

私はあなたが正しいと思う、基本クラスに "折りたたむ"ことができるもののサブクラスを追加することは、必要以上の努力のように見えます。

+0

'... Async'メソッドを呼び出すのはかなり混乱しないでしょうか?私はそうしないでパターンを破ることはできませんか? –

+0

@Georgどのパターンを壊していますか?あなたは...と非同期メソッドを持っています...正しい非同期名。 – EpicSam

+0

私はそれをAsyncと呼ぶことによってパターンを壊してしまいます。しかし、私はAsyncというメソッドも本当に非同期であると期待しています。 –

関連する問題