返回会话对象的函数 - 这没问题



假设我想构建一个应用程序来连接到服务器并上传,删除,...文件。

首先,我需要以某种方式连接,并且需要一个会话。我可以构建一个返回会话的函数,然后我可以对这个会话对象做任何我想做的事情吗?像这样:

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?因为上传后我怎么知道它成功了?也许布尔值更好?(如果我得到真的,我知道它是成功的,如果假的它不是)。有什么想法吗?;)感谢

我以前的经验是将数据库会话包装为 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);
}

但这只是一个示例;您可以根据适合您的设计来玩转它。

就传递会话对象而言,我认为只要它是引用类型,您就没有理由不能(除非有一些我不知道的 qwirk)。 但是如果我是你,我会尝试在调试器中运行一个实例,尝试一下,然后看看会发生什么。

就实施void uploadFile()而言,取决于您。 根据我的经验,大多数doSomething函数在失败时都会引发异常,所以这就是我会做的。 此外,如果您的函数失败,则可能是因为某些内部函数抛出了异常,所以我可能会让该异常冒泡。

相关内容

最新更新