Những gì tôi có:Repository mẫu - làm cho nó kiểm chứng, DI và IoC thân thiện và IDisposable
public interface IRepository
{
IDisposable CreateConnection();
User GetUser();
//other methods, doesnt matter
}
public class Repository
{
private SqlConnection _connection;
IDisposable CreateConnection()
{
_connection = new SqlConnection();
_connection.Open();
return _connection;
}
User GetUser()
{
//using _connection gets User from Database
//assumes _connection is not null and open
}
//other methods, doesnt matter
}
Điều này cho phép các lớp học đang sử dụng IRepository được dễ dàng kiểm chứng và container IoC thân thiện. Tuy nhiên ai đó sử dụng lớp này phải gọi CreateConnection trước khi gọi bất kỳ phương thức nào đang lấy thứ gì đó từ cơ sở dữ liệu, nếu không thì ngoại lệ sẽ bị ném. Bản thân điều này rất tốt - chúng tôi không muốn có kết nối lâu dài trong ứng dụng. Vì vậy, sử dụng lớp này tôi làm điều đó như thế này.
using(_repository.CreateConnection())
{
var user = _repository.GetUser();
//do something with user
}
Unfortunetelly đây không phải là giải pháp rất tốt bởi vì mọi người sử dụng lớp này (kể cả thậm chí tôi!) Thường quên gọi _repository.CreateConnection()
trước khi gọi phương pháp để có được một cái gì đó từ cơ sở dữ liệu.
Để giải quyết vấn đề này, tôi đang xem bài đăng trên blog Mark Seemann SUT Double nơi anh ấy triển khai mẫu Repository theo cách chính xác. Thật không may, ông làm cho Repository thực hiện IDisposable, có nghĩa là tôi không thể đơn giản tiêm nó bởi IoC và DI vào các lớp và sử dụng nó sau đó, bởi vì chỉ sau một lần sử dụng nó sẽ được xử lý. Ông sử dụng nó một lần cho mỗi yêu cầu và ông sử dụng ASP.NET WebApi khả năng để xử lý nó sau khi xử lý yêu cầu được thực hiện. Đây là một cái gì đó tôi không thể làm bởi vì tôi có trường hợp lớp học của tôi sử dụng Repository làm việc tất cả các thời gian.
Giải pháp tốt nhất có thể ở đây là gì? Tôi có nên sử dụng một số loại nhà máy mà sẽ cho tôi IDisposable IRepository? Liệu nó có dễ dàng kiểm tra được không?
Xin vui lòng không, [không có nhà máy] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100). – Steven