6

Có vẻ như có rất nhiều ví dụ về việc triển khai mẫu Repository cho LINQ to SQL. Hầu hết trong số họ có tính năng IRepository và DI; Một số đã thực hiện Đơn vị công việc và một số không. Tôi đã cố gắng đọc như hầu hết các kết quả trả về bởi các tìm kiếm trên SO và Google trên các mẫu kho lưu trữ LINQ đến SQL. Tuy nhiên tôi đã không đi qua một giải pháp hoàn chỉnh nào được nêu ra.Mẫu lưu trữ với LINQ to SQL bằng cách sử dụng IoC, Dependency Injection, Unit of Work

Từ bài đọc của tôi, tôi đã thực hiện một mô hình kho như hình dưới đây:

repository pattern

Tôi đang sử dụng DI để đăng ký các giao diện mà trên đó các kho đang phụ thuộc:

this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(), 
    new InjectionConstructor(connectionString)); 
this.container.RegisterType<IDataContextFactory, DataContextFactory>(); 

Thực hiện của mẫu Kho lưu trữ:

public interface IPrivilegeRepository : IRepository<PrivilegesEntity> 
{ 
    IList<MenuModel> GetRootMenu(); 
    IList<MenuModel> GetChildMenu(int parentId); 
} 

public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository 
{ 
    #region IPrivilegeRepository Members 

    public IList<MenuModel> GetRootMenu() 
    { 
     return FindAll(menu => menu.ParentId == null) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(c => EntityMapper.Privileges.ToBusinessObject(c)) 
      .ToList(); 
    } 

    public IList<MenuModel> GetChildMenu(int parentId) 
    { 
     return FindAll(menu => menu.ParentId == parentId) 
      .OrderBy(menu => menu.SortOrder) 
      .Select(menu => EntityMapper.Privileges.ToBusinessObject(menu)) 
      .ToList(); 
    } 

    #endregion 

    public PrivilegeRepository(IDataContextFactory dataContextFactory) 
     : base(dataContextFactory) 
    { 
    } 
} 

IRepository giao diện chung:

public interface IRepository<T> where T : class 
{ 
    IEnumerable<T> All(); 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 
    T Single(Expression<Func<T, bool>> exp); 
    T First(Expression<Func<T, bool>> exp); 
} 

lớp Repository được thực hiện như dưới đây với hiện thực của IRepository (không hiển thị) và đang có một sự phụ thuộc vào IDataContextFactory mà DI đang chăm sóc cho:

public class Repository<T> : IRepository<T> where T : class 
{ 
    public Repository(IDataContextFactory dataContextFactory) 
    { 
     this.dataContextFactory = dataContextFactory; 
    } 
} 

Repositories được tiêu thụ sử dụng IoC:

PrivilegeRepository repository = container.Resolve<PrivilegeRepository>(); 

Tôi trả về kết quả truy vấn dưới dạng bộ sưu tập đối tượng doanh nghiệp để tránh sự phụ thuộc vào Lin q để SQL trên các lớp ứng dụng mà tôi sử dụng kho lưu trữ. Kịch bản trên hoạt động tốt với ứng dụng WPF của tôi đang sử dụng mẫu MVVM. Tôi có ViewModel aks Presenter classes không phụ thuộc vào các lớp được tạo bởi Linq-SQL.

Làm cách nào để mở rộng mẫu này để tôi có thể lưu dữ liệu vào Cơ sở dữ liệu. Tôi muốn chuyển đối tượng Business trở lại kho lưu trữ và lưu chúng. Có thể không? Làm thế nào tôi có thể thực hiện Unit of Work trong một kịch bản như vậy.

+0

Bạn có thể muốn xem mẫu Active Record; nó bao gồm các hoạt động CRUD đầy đủ cùng với khả năng truy cập giống như kho lưu trữ. –

+0

Còn khung Entity được xuất xưởng với VS2010 thì sao? – Raj

+0

@Raj Tôi nghĩ rằng bạn đã bỏ lỡ một thực tế rằng anh ấy muốn trở thành ORM độc lập. – Novus

Trả lời

1

Đây là vấn đề tôi đã gặp rất nhiều lần. Bạn muốn tách các đối tượng kinh doanh khỏi chiến lược lưu trữ dữ liệu của mình. Khi bạn thực hiện một phép chiếu đối với các đối tượng nghiệp vụ của mình, bạn sẽ mất rất nhiều tính năng tốt đẹp của việc có một kho lưu trữ (bạn có thể trả về IQueryable ví dụ như sử dụng việc thực thi deffered). Cách duy nhất bạn có thể thực hiện điều này là bằng cách cho Kho lưu trữ của bạn một sự phụ thuộc đối với một ví dụ IMapper<BusinessObject>. Bằng cách này, bạn có thể ánh xạ đối tượng kinh doanh của mình tới đối tượng mà kho lưu trữ của bạn cần để lưu trữ thứ gì đó nhưng để lại sự trừu tượng tại chỗ vì đối tượng kinh doanh của bạn vẫn tồn tại dốt nát.

5

Here is an answer of mine to a similar question.

Ý tưởng cơ bản là generic kho giao diện không làm việc rất tốt, nhưng chung kho triển khai công việc tuyệt vời. Nó sử dụng LINQ to SQL làm ví dụ ORM và nên cung cấp một số thông tin chi tiết cho câu hỏi của bạn.

Hãy chắc chắn đọc qua câu trả lời của Paul, đặc biệt là các nhận xét.

Các vấn đề liên quan