所有其他人已经写下了你<代码>Database类别的正确设计,因此我不重复。 然而,我看不出为什么你想要做的事情是不可能的。 因此,情况就是如此。
你们想要做的是,在请打电话到<代码>Dispose时发现,这种方法是在例外情况下使用的。 当你能够做到这一点时,开发商必须明确打到<条码>。 然而,这里的问题是,在互联网上无法可靠地发现这一点。 虽然有机制对最后的推差(如HttpServerUtility.Get LastError),但这些机制是具体的东道国(即ASP)。 该网络还有一个作为窗口表格的机制。 虽然你可以写出具体东道国执行工作的文字,例如,只有执行项目才能完成。 NET还有另一个更为重要的问题:what,如果您的<代码>Database类别在例外情况下使用或创建?。 例如:
try
{
// do something that might fail
}
catch (Exception ex)
{
using (var database = new Database())
{
// Log the exception to the database
database.Add(ex);
}
}
如上例,在<代码>Exception<>/code>类别中使用了/Database类别时,您的<代码>Dispose方法应当如何知道它仍必须实施? 我可以想办法解决这一问题,但这样做将非常脆弱,容易发生错误。 举一个例子。
在创建<代码>Database的过程中,你可以检查是否在例外情况下发出,如果情况如此,可以储存这一例外情况。 在请打电话到<代码>Dispose时,请检查最后提出的例外是否不同于附则的例外。 如果情况不同,你应退席。 如果没有,承诺。
虽然这似乎只是一种解决办法,但这一守则的例子是什么?
var logger = new Database();
try
{
// do something that might fail
}
catch (Exception ex)
{
logger.Add(ex);
logger.Dispose();
}
例见<代码>Database。 因此,不能正确地发现它不会退缩。 虽然这可能是一个有争议的例子,但它表明,你在试图以无需明确要求<代码>Commit
归根结底,你会把“”类同起来难以设计,难以维持,你永远不会真正做到。
正如所有其他人已经说过的那样,需要一个明确的<代码>Commit或Complete
电话的设计将更易于实施,更容易获得权利,易于维护,并使使用代码更加可读(例如,它考虑到开发商的期望)。
请注意,如果你再次担心开发商要把这一条码称作方法:你可以在<代码>Dispose的方法中做一些检查,看看它是否被称作没有Commit<>Commit
,并写给该星,或在脱胎时设定一个断点。 采用这种解决办法仍然比试图完全删除。
Update:
Adrian wrote an intersting alternative to using HttpServerUtility.GetLastError. As Adrian notes, you can use Marshal.GetExceptionPointers()
which is a generic way that would work on most hosts. Please note that this solution has the same drawbacks explained above and that calling the Marshal
class is only possible in full trust