Tôi sắp bắt đầu một dự án mới, sẽ sử dụng Entity Framework (EF) làm ORM để liên kết với SQL Server. Tôi đã và đang thực hiện một số lượng lớn việc đọc để hiểu cách tiếp cận tốt để làm việc với EF liên quan đến trừu tượng và cuối cùng là làm cho mã của tôi có thể kiểm thử được.Có sử dụng một Abstraction Repository trên Entity Framework Good Practice hay không?
Vấn đề là đọc nhiều hơn tôi làm bối rối hơn tôi trở nên với tất cả.
gì tôi nghĩ là một cách tốt để đi:
tôi sẽ đi xuống con đường kho, làm cho họ để họ có thể dễ dàng tiêm thông qua giao diện và dễ dàng để thử cho mục đích thử nghiệm, từ rất nhiều của các ví dụ tôi dường như tìm thấy, có rất nhiều người thề theo cách tiếp cận này. Đối với các phần lưu trữ tương tác với EF, tôi đã đi với các bài kiểm tra tích hợp vì sẽ không có logic nghiệp vụ trong Repos của tôi, tôi sẽ chuyển nó thành các lớp Service/Controller để xử lý.
Một số nói Pattern Repository là một sự trừu tượng không có cơ sở
http://ayende.com/blog/3955/repository-is-the-new-singleton
Có các liên kết khác nhưng tôi không muốn lũ câu hỏi này với quá nhiều
tôi loại được điều này, tôi hiểu rằng EF và việc thực hiện nó về bản chất là trừu tượng, nhưng với tôi nó có vẻ như là một cái cụ thể (nó chạm vào thứ gì đó bên ngoài phạm vi ứng dụng ... DB) Vấn đề đối với tôi là nó p chúng tôi có thể tương tác với các bối cảnh dữ liệu và đơn vị công việc từ bên trong Dịch vụ của tôi, nhưng cảm thấy như tôi đang trộn dữ liệu đăng nhập truy cập với logic nghiệp vụ ở cấp độ đó và sau đó làm thế nào địa ngục để tôi kiểm tra đơn vị đó?
Tôi dường như đã đọc rất nhiều đến nỗi bây giờ tôi không có hướng rõ ràng và khối lập trình không thể tránh khỏi đã được cài đặt. Tôi đang cố tìm cách tiếp cận sạch sẽ và tôi có thể kiểm tra.
CẬP NHẬT - Giải pháp tôi đang đi để bắt đầu với
tôi đã đi một con đường hơi khác nhau thì một trong các câu trả lời được đưa ra bởi simon nhưng nhờ vào một bài viết mà tôi đã đọc nhưng ông nộp một lần nữa vì vậy tôi đã đi qua nó một lần nữa. Trước hết tôi đang sử dụng Code First vì tôi có một cơ sở dữ liệu hiện có và vì một số lý do không thích các công cụ thiết kế. Tôi đã tạo ra một số đối tượng POCO đơn giản và một số ánh xạ, để giữ cho mọi thứ đơn giản ở đây tôi sẽ chỉ hiển thị một POCO/Mapping và những gì không.
POCO
public abstract class BaseEntity<T>
{
[Key]
public T Id { get; set; }
public string Name { get; set; }
public DateTime CreatedOn { get; set; }
}
public class Project : BaseEntity<int>
{
public virtual ICollection<Site> Sites { get; set; }
public bool Active { get; set; }
}
Đơn vị của giao diện làm việc
public interface IUnitOfWork
{
IDbSet<Project> Projects { get; }
void Commit();
}
Context
internal class MyContext : DbContext
{
public MyContext(string connectionString)
: base(connectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectMap());
}
}
bê tông UnitOfWork Mã
public class UnitOfWork : IUnitOfWork
{
readonly MyContext _context;
const string ConnectionStringName = "DBConn";
public UnitOfWork()
{
var connectionString = ConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString;
_context = new FosilContext(connectionString);
}
public IDbSet<Project> Projects
{
get { return _context.Set<Project>(); }
}
public void Commit()
{
_context.SaveChanges();
}
}
thử nghiệm cơ bản
var _repo = new UnitOfWork().Projects;
var projects = from p in _repo
select p;
foreach (var project in projects)
{
Console.WriteLine(string.Format("{0} - {1} - {2} - {3})", project.Id, project.Name, project.Active.ToString(), project.CreatedOn.ToShortDateString()));
}
Console.Read();
Các UnitOfWork là tự giải thích nhưng dựa trên một bối cảnh cụ thể, tôi có thể tạo ra một IUnitOfWork giả và vượt qua nó trong một IDBSet giả để thử nghiệm . Đối với tôi, và điều này có thể trở lại để cắn tôi về mặt kiến trúc, tôi càng nhận được nhiều hơn về điều này nhưng không có một Repo trên đầu trang của EF trừu tượng này đi (tôi nghĩ). Như Điều giải thích IDbSet là tương đương với một Repo để thats những gì tôi đang sử dụng. Tôi kinda ẩn bối cảnh tùy chỉnh của tôi đằng sau UoW nhưng tôi sẽ xem làm thế nào mà chảo ra.
Điều tôi đang nghĩ bây giờ là tôi có thể sử dụng trong lớp dịch vụ, sẽ đóng gói dữ liệu và quy tắc kinh doanh nhưng phải là đơn vị có thể thử nghiệm vì tôi có thể giả mạo các mục cụ thể của EF. Hy vọng rằng sẽ làm cho các bộ điều khiển của tôi khá nạc, nhưng chúng ta sẽ thấy :)
Đừng quên rằng nếu bạn đang sử dụng khung thực thể, 'DbContext' _is_ giống như một UnitOfWork và' DbSet' _is_ giống như một Kho lưu trữ. Câu hỏi này, tôi nghĩ rằng, lời mời cho ý kiến cá nhân và có thể không phù hợp cho Stack Overflow nhưng đó là ý kiến của tôi rằng nếu bạn đang sử dụng Entity Framework, bạn cũng có thể nắm lấy mẫu. Việc gói thêm 'DbContext' và' DbSet 'thực sự là để cho một sự trừu tượng hóa rất mỏng trên lớp bê tông để dễ kiểm thử đơn vị và, ở một mức độ nhất định, Dependency Injection. –
Cảm ơn nhận xét. Những gì tôi không nhận được (tôi rất mới để EF) là những gì lớp mỏng này sẽ như thế nào. Tôi đã xem một đoạn video cụ thể về EF và thử nghiệm và tác giả đã sử dụng IDBSet và giới thiệu một giao diện IContext, nhưng với một đơn vị công việc riêng biệt (những ví dụ này đã sử dụng một kho lưu trữ) đã được chuyển. Lớp mỏng là IDBSet và IContext. tác giả lưu ý rằng bạn đã giấu đi EF với những trừu tượng này dường như giống hệt như vấn đề mọi người có với Mẫu Kho lưu trữ? – Modika
Tôi đang di chuyển bức tường văn bản trở lại câu trả lời trước của tôi. Các hạn chế về ký tự khiến định dạng hơi khó. –