C# 函数返回一个会话对象-这样可以吗?

C# 函数返回一个会话对象-这样可以吗?,c#,.net,session,C#,.net,Session,让我们假设我想建立一个应用程序连接到服务器和上传,删除。。。档案 首先,我需要以某种方式连接,我需要一个会话。我是否可以构建一个返回会话的函数,然后我可以对这个会话对象执行任何我想要的操作?比如: mySession connect(url, user, password) { //connecting return session; } void uploadFile(File f) {/*...*/}; var currentSession = connect(/*...*/);

让我们假设我想建立一个应用程序连接到服务器和上传,删除。。。档案

首先,我需要以某种方式连接,我需要一个会话。我是否可以构建一个返回会话的函数,然后我可以对这个会话对象执行任何我想要的操作?比如:

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

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

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

currentSession.uploadFile(...);
currentSession.deletFile(...);
currentSession.close(...);
这会好吗?如果我有一个会话对象,我可以将它传递到任何地方,然后说
.upload
.delete
。无论什么


你觉得像
void uploadFile()这样的函数怎么样?也许我应该更改void?因为上传后我怎么知道它成功了?也许布尔型更好?(如果我是真的,我知道它是成功的,如果是假的,我知道它不是)。有什么想法吗?;)Thx

我以前的经验是将数据库会话包装为IDisposable,因此消费者总是通过以下方式请求数据库会话:

using(var session = Database.CreateSession())
{ 
    session.uploadFile(); 
    session.deleteFile();
}
然后,在包装会话的
Dispose
方法中,它将刷新并关闭连接,并处理任何必要的内容。通过这种方式,我确保(通常)连接已关闭并被处理;至少如果开发人员/我正确地使用它

至于第二个问题,您的
uploadFile
可以在成功时返回true/false或引发异常。如果你经常因为正当的原因而期望它失败,那么也许真/假更好。您还可以让它返回一个
UploadResults
对象,该对象具有布尔的pass/fail属性以及失败原因/异常

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
函数在失败时抛出异常,所以我会这样做。另外,如果你的函数失败了,有可能是因为某个内部函数抛出了一个异常,所以我可能会让这个异常冒泡出来

供参考-,