2013-07-22 38 views
7

Tôi muốn biết cách tiếp cận tốt nhất giữa việc sử dụng câu lệnh và tạo biến công khai là gì. Ví dụ của tôi là như sau: Tôi có một lớp người quản lý kế thừa từ dùng một lần và lớp này có quyền truy cập vào dbcontext và phương thức của tôi. Những gì tôi đang làm bây giờ là trên lớp cs của tôi làm một ussing đến lớp đó và tạo ra và tiêu diệt đối tượng của tôi theo nhu cầu của tôi. Ví dụ:Cách tiếp cận tốt nhất giữa Sử dụng và đối tượng công cộng?

public class StudentManager: IDisposable 
{ 
    private ISchoolUnitOfWork _unitOfWork; 

    public StudentManager() 
    { 
     _unitOfWork = new SchoolUnitOfWork(); 
    } 

    public IEnumerable<Student> GetStudents() 
} 

Mở lớp cs của tôi, tôi làm:

private IEnumerable<Stundets> GetStudents() 
{ 
    using (StudentManager manager = new StudentManager()) 
    { 
     return = manager.GetStudents(); 
    } 
} 

HOẶC

private StudentManager = new Studentmanager(); 

gì là cách tốt nhất để làm điều đó: có trường hợp của StudentManager của tôi (chỉ tạo kết nối và phá hủy khi rời khỏi trang) hoặc làm việc với using?

Tôi hơi bối rối về điều đó. Cảm ơn trước!

Tôi cập nhật ngữ cảnh của mình trên cùng một người quản lý gọi là lưu trong ngữ cảnh của tôi là giao diện đơn vị công việc của tôi, tôi không truy cập trực tiếp vào ngữ cảnh, nhưng khi tôi xây dựng, tôi xây dựng một loại đơn vị công việc.

Tôi lưu các hoạt động của mình trên trình quản lý. Vì vậy, về quản lý của tôi về bản cập nhật, chèn, sửa đổi mà tôi gọi là phương pháp tiết kiệm, ví dụ:

public class StudentManager.... 

     public Student UpdateStudent(Student student) 
     { 
      IStudentService service = new StudentService(_unitOfWork.StudentRepository); 
      Student student= service.Update(student); 
      _unitOfWork.Save(); 
      return student; 
     } 

Nói chung, tôi có một giao diện IUnitOfWork và UnitOfWork, cũng có một IRepository và một kho lưu trữ. Và tôi chỉ sử dụng một người quản lý để không khởi tạo UnitOfWork của tôi trực tiếp, nhưng với một người quản lý nó ... Tôi nghĩ đó là hợp pháp và hữu ích!

+4

Lưu ý bên cạnh, doanh nghiệp của bạn các lớp không nên sở hữu kho và không cần IDisposable. Nhưng điều đó chỉ thay đổi vấn đề của bạn với kết nối. –

+0

Không có gì sai với việc giữ ngữ cảnh trong một trường riêng và xử lý nó trong phương thức Dispose() của lớp xây dựng nó, IMO. Việc sử dụng khối là lối tắt đến mẫu thử/nắm bắt/cuối cùng để đảm bảo rằng các đối tượng dùng một lần được xử lý khi bạn làm xong - nhưng đây chỉ là * một mẫu * để đảm bảo rằng các đối tượng được xử lý kịp thời. Sự tồn tại của phím tắt này không tự động hiển thị tất cả các mẫu khác không sử dụng được. –

Trả lời

1

Cách tốt nhất là tuyên bố using vì tự động gọi số Dispose. Bạn có thể đảm bảo rằng logic xử lý của bạn sẽ xảy ra. Điều này, trên thực tế, làm thế nào bạn nên sử dụng các đối tượng như SqlConnectionSqlCommand là tốt. Vì vậy, bạn đang làm đúng với using.

Thực tế, bạn đã tuyên bố rằng bạn đang sử dụng DbContext để truy cập dữ liệu. Chúng phải là được khởi tạo theo yêu cầu và được gói trong một số using. Không cần phải chia sẻ một thể hiện của các loại lớp này vì kết nối tổng hợp được thực hiện tại SQL Server thông qua chuỗi kết nối.

+0

Nhưng điều đó có thể dẫn đến việc tạo nhiều bản sao. –

+0

@ HenkHolterman, giống như bạn sẽ tạo một 'SqlConnection' mới mỗi lần bạn muốn sử dụng nó. –

+0

Không, không giống nhau. Các kết nối được gộp lại. Các bối cảnh sẽ mất bộ nhớ cache theo dõi thay đổi của họ mỗi lần. –

0

Nếu bạn sử dụng bằng cách sử dụng thì có thể chỉ có một lần bạn cần viết nhiều nội dung tương tự nhiều lần. Ví dụ:

//To get all students 
private IEnumerable<Stundets> GetStudents() 
{ 
using (StudentManager manager = new StudentManager()) 
{ 
    return = manager.GetStudents(); 
} 
} 

//To save Students 
//To get all students 
private IEnumerable<Stundets> SaveStudents() 
{ 
using (StudentManager manager = new StudentManager()) 
{ 
    return = manager.Save(); 
} 
} 

v.v. Nhưng ở đây bạn không phải lo lắng về việc vứt bỏ vật thể. Nó sẽ được chăm sóc tự động. Nếu bạn đi khai báo toàn cầu, bạn cần phải thực hiện nó theo cách thủ công. Vì vậy, những gì tôi cần phải nói, Nếu bạn phải sử dụng StudentManager trên tất cả các trang tại sao bạn không làm cho nó toàn cầu và sử dụng nó trên tất cả các địa điểm yêu cầu, sử dụng cả hai.Một cái gì đó như thế này

private StudentManager manager; 

//To get all students 
private IEnumerable<Stundets> GetStudents() 
{ 
using (manager = new StudentManager()) 
{ 
    return = manager.GetStudents(); 
} 
} 

//To save Students 
//To get all students 
private IEnumerable<Stundets> SaveStudents() 
{ 
using (manager = new StudentManager()) 
{ 
    return = manager.Save(); 
} 
} 
+0

Nếu tôi làm điều này khi tôi thực hiện một thao tác, nó sẽ tự động hủy, phải không? Tôi chỉ sử dụng một người quản lý để không tải lớp cs và chỉ cần gọi dbcontext của tôi khi tôi cần nó ... – user2528557

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