私のクラスにIDisposableというメンバ変数がある場合はIDisposable
を実装する必要があります。私のクラスはIDisposableを自身でデータベースオブジェクト(以下db
クラスのメンバー)が含まれているので、まあ、私はIDisposable
インタフェースを実装しています:IDisposableを実装するときにコンストラクタで例外を処理する
public class CommissionModel : IDisposable
{
protected PetaPoco.Database db;
public CommissionModel()
{
string connectionString = "Server=localhost;...";
// The line below may throw an exception (!!!)
db = new PetaPoco.Database(connectionString, "mysql");
}
// Automatically close database connection
public void Dispose()
{
if (db != null)
db.Dispose();
db = null;
}
public void InsertRecord(Record somerecord)
{
// ...
db.Insert(somerecord);
}
問題はdb
メンバーのインスタンス化は、いくつかの状況下で失敗する可能性があります。 例外がコンストラクタでスローされ、データベースオブジェクトが作成されない場合はどうすればよいですか?例外を元に戻すか、InsertRecordメソッドでdb != null
かどうかを確認する必要がありますか?
IMO例外を元に戻す必要があります。元のexepctionをより高いレベルのものにラップして、レイヤーの分離を改善することができます。何かが間違っていることを知らせる方が良いです。 – Krzysztof
[SOLID](https://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29)、具体的には[SRP](https://en.wikipedia.org/wiki/Single_responsibility_principle)をご覧ください。と[DI](https://en.wikipedia.org/wiki/Dependency_inversion_principle) – oleksii