返回会话对象的函数 - 这没关系吗?

时间:2012-07-05 14:48:40

标签: c# .net session

让我们说我想构建一个连接服务器并上传,删除......文件的应用程序。

起初我需要以某种方式连接,我需要一个会话。我可以构建一个返回会话的函数,之后我可以使用此会话对象执行任何操作吗?类似的东西:

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

2 个答案:

答案 0 :(得分:2)

我之前的经验是将数据库会话包装为IDisposable,因此消费者总是通过使用来请求数据库会话:

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

然后在包装会话的Dispose方法中,它将刷新并关闭连接并处理任何必要的内容。通过这种方式,我(通常)确保连接被关闭和处理;至少如果开发人员/我自己正确使用它。

至于你的第二个问题,你的uploadFile可以在成功时返回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 :(得分:1)

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

至于void uploadFile()实施由您决定。根据我的经验,大多数doSomething函数在失败时抛出异常,这就是我要做的。此外,如果你的函数失败了,那可能是因为某些内部函数引发了异常,所以我可能会让这个异常冒出来。