2012-07-05 42 views
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()的功能是什麼 - 也許我應該改變無效?因爲上傳後我怎麼知道它是成功的?也許一個布爾值更好? (如果我的確如此,我知道它是成功的,如果是假的它不是)。有任何想法嗎? ;)THX

+0

FYI - [大寫約定](http://msdn.microsoft.com/en-us/library/ms229043.aspx),[方法命名指南(http://msdn.microsoft.com/en-us /library/4df752aw(v=vs.71).aspx) – jrummell 2012-07-05 15:04:29

回答

2

我以前的經驗已經包裝成IDisposable的數據庫會話,讓消費者總是通過使用要求數據庫會話:

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

然後在包裹會議的Dispose方法,這將刷新並關閉連接和處置任何必要的東西。通過這種方式我可以確保(通常)連接被關閉和處理;至少如果開發人員/我自己正確使用它。

關於你的第二個問題,您可以uploadFile成功返回真/假或拋出異常。如果你期望它經常出於合法原因而失敗,那麼可能是真/假更好。您也可以讓它返回一個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

至於繞過你的會話對象那張,我看不出爲什麼你不能,只要它是一個引用類型(除非有一些qwirk它,我不知道)。但是如果我是你,我會試着讓調試器中運行的一個實例,嘗試一下,然後看看會發生什麼。

至於void uploadFile()的實施是由你。根據我的經驗,大多數doSomething函數在失敗時會拋出異常,所以這就是我所要做的。另外,如果你的函數失敗了,有可能是因爲一些內部函數拋出異常,所以我可能會讓這個異常冒出來。