Tôi có sau Repository ADO NetIDisposable trên một kho tiêm
public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;
public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}
public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}
kho này được tiêm với một container IoC lên một Dịch vụ tên miền và được sử dụng như sau:
public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;
public UserDomainService(IRepository repository)
{
Repository = repository;
}
public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");
Repository.Add(user);
Repository.Commit();
}
}
}
Ý tưởng là tôi luôn đặt đối tượng Repository trong một câu lệnh using để khi kết thúc, kết nối được đóng và xử lý nhưng tôi thấy nó là một vấn đề vì lớp Service Service vẫn còn sống và nếu có cuộc gọi thứ hai, sẽ thất bại vì kho lưu trữ đã bị hủy.
Bây giờ tôi có toàn quyền kiểm soát tất cả mã và tôi chỉ muốn thiết kế các cuộc gọi dịch vụ hạt thô, nhưng có điều gì đó về toàn bộ điều không cảm thấy đúng.
Tôi làm như thế này để tôi có thể tránh được rằng Dịch vụ miền biết về các phương thức OpenConnection và CloseConnection trong kho lưu trữ.
Thiết kế này có kém hay là có cách nào tốt hơn để thực hiện việc này?
Sau khi suy nghĩ: Tất cả cây phụ thuộc đang được tạo ở cấp WCF khi yêu cầu đến và tất nhiên bạn có thể thấy kết nối được mở tại thời điểm đó vì nó xảy ra trong bộ dựng của kho. nó không phải là xấu vì nó chỉ mở cho thời lượng của cuộc gọi cụ thể này. Tôi có đúng về giả định này hay tôi đang làm điều gì đó khủng khiếp xấu bằng cách mở kết nối DB quá sớm trong quá trình này?
'IRepository' có được kết hợp chặt chẽ với 'Repository' không? Có nghĩa là, nó có chứa các phương pháp của nó, chẳng hạn như 'Tìm'? Nếu vậy, giao diện đó có ngụ ý 'IDisposable'? –
Tôi có câu hỏi của riêng tôi có thể liên quan đến điều này: [ServiceContainer, IoC, và các đối tượng dùng một lần] (http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects). –
Tại sao bạn cần 'SqlConnection' trong' Repository'? Có vẻ giống như một cái gì đó cho 'IUnitOfWork' của bạn. – Steven