2013-07-22 20 views
7

我想知道使用語句和創建公共變量之間的最佳方法是什麼。 我的例子如下: 我有一個繼承自一次性的管理器類,並且這個類可以訪問我的dbcontext和它的方法。 我現在正在做的是在我的課堂上爲這個班級做一些事情,並根據我的需要創建和銷燬我的對象。 例如:使用和公共對象之間的最佳方法?

public class StudentManager: IDisposable 
{ 
    private ISchoolUnitOfWork _unitOfWork; 

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

    public IEnumerable<Student> GetStudents() 
} 

在我的CS類我做的:

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

OR

private StudentManager = new Studentmanager(); 

什麼是做到這一點的最好辦法:有我StudentManager的實例(只創建連接並銷燬離開頁面時)或使用using

我對此有點困惑。提前致謝!

我在同一個管理器上更新我的上下文,在我的上下文中調用save,這是我工作單元的一個接口,我不直接訪問上下文,但是當我構建它時,我構造一個類型的單元工作。

我確實節省了我在經理人身上的克勞德操作。所以我在更新,插入經理,修改我調用保存方法,例如:

public class StudentManager.... 

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

一般情況下,我有一個接口IUnitOfWork和的UnitOfWork,也有IRepository和倉庫。而且我只是使用一個經理來直接實例化我的UnitOfWork,但是有一個經理來處理它......我認爲這是合法和有用的!

+4

旁註的頁面,你的生意類不應該擁有存儲庫,也不應該需要IDisposable。但是這隻會改變連接的問題。 –

+0

將上下文保留在私有字段中並將其放置在構造它的類的Dispose()方法中,IMO沒有任何問題。使用塊是try/catch/finally模式的一個快捷方式,它可以確保在完成對象處理時丟棄一次性對象 - 但這僅僅是一種模式,用於確保對象及時處理。此快捷方式的存在不會自動使所有其他模式無法使用。 –

回答

1

最好的方法是using聲明,因爲它自動調用Dispose。你可以保證你的處置邏輯會發生。實際上,這應該如何使用像SqlConnectionSqlCommand這樣的對象。所以你正在用using做對。

實際上,您表示您正在使用DbContext來訪問數據。這些應該是根據需求實例化,幷包裝在using。不需要共享這些類的實例,因爲連接池通過連接字符串在SQL Server處完成

+0

但是這可能會導致創建多個副本。 –

+0

@HenkHolterman,就像你每次想要使用它時都會創建一個新的'SqlConnection'一樣。 –

+0

不,不一樣。連接彙集。上下文每次都會丟失更改跟蹤的緩存。 –

0

如果你使用的話可能在一個單一的,你需要不止一次地寫類似的東西。例如

//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(); 
} 
} 

等等。但在這裏你不必擔心物體的處理。它會自動處理。如果您要進行全局聲明,則需要手動完成。所以我需要說,如果你必須使用StudentManager遍佈你爲什麼不讓它是全局的,用的全是它需要的地方,用both.Something這樣

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

如果我這樣做,當我做一個ussing它會自動關閉,對不對?我只是使用管理器來加載cs類,並在我需要時調用我的dbcontext ... – user2528557

相關問題