Tôi có một phương pháp mà tôi muốn "giao dịch" theo nghĩa trừu tượng. Nó gọi hai phương thức xảy ra để làm việc với cơ sở dữ liệu, nhưng phương pháp này không biết điều đó.Phương pháp biết quá nhiều về các phương pháp gọi là
public void DoOperation()
{
using (var tx = new TransactionScope())
{
Method1();
Method2();
tc.Complete();
}
}
public void Method1()
{
using (var connection = new DbConnectionScope())
{
// Write some data here
}
}
public void Method2()
{
using (var connection = new DbConnectionScope())
{
// Update some data here
}
}
Bởi vì trên thực tế các TransactionScope
có nghĩa là một giao dịch cơ sở dữ liệu sẽ được sử dụng, chúng ta có một vấn đề mà nó cũng có thể được đề bạt lên một giao dịch phân tán, nếu chúng ta có được hai kết nối khác nhau từ hồ bơi.
tôi có thể sửa lỗi này bằng gói phương pháp DoOperation()
trong một ConnectionScope:
public void DoOperation()
{
using (var tx = new TransactionScope())
using (var connection = new DbConnectionScope())
{
Method1();
Method2();
tc.Complete();
}
}
tôi đã DbConnectionScope
bản thân mình vì chỉ một mục đích như vậy, vì vậy mà tôi không cần phải vượt qua đối tượng kết nối đến tiểu phương (đây là ví dụ nhiều hơn so với vấn đề thực sự của tôi). Tôi đã có ý tưởng từ bài viết này: http://msdn.microsoft.com/en-us/magazine/cc300805.aspx
Tuy nhiên tôi không thích cách giải quyết này vì nó có nghĩa DoOperation
hiện nay có kiến thức mà các phương pháp đó đang gọi có thể sử dụng một kết nối (và từng có thể là một kết nối khác nhau). Làm thế nào tôi có thể cấu trúc lại điều này để giải quyết vấn đề?
Một ý tưởng tôi đang nghĩ đến là tạo ra một tổng quát hơn OperationScope
, để khi hợp tác với lối sống Castle Windsor tùy chỉnh tôi sẽ viết, sẽ có nghĩa là bất kỳ thành phần nào được yêu cầu của container với OperationScopeLifetyle
ví dụ của thành phần đó. Điều này giải quyết được vấn đề vì OperationScope
rõ ràng hơn DbConnectionScope
.
Cái gì? Ai đó đã bỏ phiếu cho câu hỏi này sẽ bị đóng? Tại sao? –