1

サーバーに接続し、ファイルをアップロード、削除するアプリケーションを構築したいとしましょう。

最初は何らかの方法で接続する必要があり、セッションが必要です。セッションを返す関数を作成して、その後、このセッション オブジェクトでやりたいことを何でもできますか? 何かのようなもの:

mySession connect(url, user, password)
{
  //connecting
  return session;
}

void uploadFile(File f) {/*...*/};

var currentSession = connect(/*...*/);

currentSession.uploadFile(...);
currentSession.deletFile(...);
currentSession.close(...);

これでいいのかな?セッション オブジェクトがあれば、どこにでも渡して、、、と言うことが.uploadでき.deleteます.whatever

また、次のような関数についてどう思いますvoid uploadFile()か? void を変更する必要がありますか? アップロード後、それが成功したことをどのように確認できますか? 多分ブール値の方が良いですか?(もし私が真なら成功したことを知り、偽ならそうではなかった)。何か案は?;) どうも

4

2 に答える 2

2

私の以前の経験では、データベース セッションが IDisposable としてラップされていたため、消費者は常に using を介してデータベース セッションを要求していました。

using(var session = Database.CreateSession())
{ 
    session.uploadFile(); 
    session.deleteFile();
}

次に、ラップされたセッションのDisposeメソッドで、接続をフラッシュして閉じ、必要なものをすべて破棄します。このようにして、(通常は)接続が閉じられて破棄されることが保証されました。少なくとも開発者/私自身が適切に使用した場合。

2 番目の質問については、uploadFile成功時に true/false を返すか、例外をスローできます。正当な理由で頻繁に失敗することが予想される場合は、おそらく true/false の方が適切です。UploadResultsまた、ブール値の合格/不合格プロパティと、失敗した理由/例外を持つオブジェクトを返すようにすることもできます。

public class MySession
{
    public UploadResults UploadFile()
    {
        try
        {
            //try upload

            return UploadResults.Succeeded();
        }
        catch (Exception ex)
        {
            return UploadResults.Failed(ex);
        }
    }
}

public class UploadResults
{
    public bool Success { get; private set; }
    public Exception FailureReason { get; private set; }


    private UploadResults(bool success, Exception failureReason)
    {
        this.Success = success;
        this.FailureReason = failureReason;
    }

    internal static UploadResults Succeeded()
    {
        return new UploadResults(true, null);
    }

    internal static UploadResults Failed(Exception failureReason)
    {
        return new UploadResults(false, failureReason);
    }
}

次に、コードは次のようになります。

using(var session = Database.CreateSession())
{ 
    var results = session.uploadFile();
    if (results.Success)
        session.deleteFile();
    else
        ReportError(results.FailureReason);
}

しかし、これは 1 つのサンプルにすぎません。自分に合ったデザインで遊ぶことができます。

于 2012-07-05T14:55:43.067 に答える
1

セッションオブジェクトを渡す限り、それが参照型である限り、それができない理由はわかりません(私が知らないqwirkがない限り)。しかし、私があなたなら、デバッガーでインスタンスを実行し、それを試してから、何が起こるかを確認しようとします。

void uploadFile()実装があなた次第である限り。私の経験から、ほとんどのdoSomething関数は失敗すると例外をスローするので、それが私が行うことです。また、関数が失敗した場合は、一部の内部関数が例外をスローしたことが原因である可能性があるため、おそらくその例外をバブルアップさせます。

于 2012-07-05T15:06:02.910 に答える