2014-02-27 63 views
2

我是一個初級Web開發人員,每天都在努力學習更多東西。linq ASP.NET MVC倉庫模式的最佳實踐是什麼

你們用Linq來實現MVC存儲庫模式的最佳做法是什麼?

我使用的一個:

與我有類似GETALL(),getOne(),更新(CRUD方法.TT文件的確切名稱創建額外的clases),刪除()填充我自己的類與實體框架,並返回這個,或使用實體框架原油

這是我實際做的一個例子。

這是我班的例如用戶

public class CEmployee : CResult 
{ 

    public string name{get;set;} 
    public string lastname{get;set;} 
    public string address{get;set;} 

    //Extracode 
    public string Fullname // this code is not in the .tt or database 
    { 
     get 
     { 
      return name + lastname; 
     } 
    } 

    public <List>CEmployee getAll() 
    { 
     try 
      { 
       var result = (from n in db.Employee 
           select new CEmployee // this is my own class I fill it using the entity 
           { 
            name = n.name, 
            lastname = n.lastname, 
            address = n.address 
           }).ToList(); 

           if (result.Count > 0) 
           { 
            return result; 
           } 
           else 
           { 
            return new List<CResult> 
            { 
             new CResult 
             { 
              has_Error = true, 
              msg_Error = "Element not found!!!!" 
             } 
            } 
           } 

      } 
     catch 
      { 
       return Exception(); 
      } 


    } 
} 

我GETALL的方法,我做的所有事情,我返回一個充滿我喜歡的類型,但在網絡上我看到的方式,人們normaly返回實體類型,但我這樣做是爲了操縱我的迴應,如果我想返回額外的信息,我只需要列出一個例子,最好的方法是什麼,返回mytype或返回實體類型?

PD,我也使用這個類像我ViewModel.And我這樣做是爲我所有的課程。

+0

你爲什麼要在這裏引入異常處理?這不是必需的。 – JonH

+0

這可能是一個新手的錯誤,但我在那裏介紹它,導致如果它拋出數據庫超時。 – user1431866

+1

您正在吞嚥確切的異常並拋出一個新的空異常,銷燬有關實際出錯的任何數據(消息,堆棧跟蹤)。如果你不打算做一些有用的事情,肯定會刪除try/catch塊。 –

回答

1

我目前使用依賴注入來設置DAL(數據訪問層)的項目之一。我們也使用n層方法;這將知識庫與業務邏輯和前端的關注區分開來。

因此,我們將從4個左右的應用程序鏈接到基礎項目開始。其中一個處理數據訪問,這將是您的存儲庫;請閱讀Ninject瞭解更多信息。我們的下一層是我們的域,它包含由t4模板(.tt文件)構建的實體以及我們的DTO(數據傳輸對象,它們是用於在層之間移動數據的平面對象)。然後,我們有服務層,服務層或業務邏輯層保存處理CRUD操作和任何需要的數據操作的服務對象。最後,我們的前端是Model-View-ViewModel層,並處理控制器和頁面構建。

的MVVM調用服務,服務對象調用數據訪問層和Entity Framework可與Ninject訪問數據和存儲在DTO,因爲它是跨層移動的。

現在這可能看起來過於複雜,這取決於您正在編寫的應用程序,這是爲高度可擴展和可擴展的Web應用程序而構建的。

0

理想的MVC應用程序,你會想在倉庫就像一個單獨的項目,不同的層,我們稱之爲數據層。

您將擁有包含了通用的方法簽名一樣GETALL,GetById,創建或UpdateById的IRepository接口。您還將擁有包含共享實現的抽象RepositoryBase類,例如Add,Update,Delete,GetById等。

您使用IRepository接口的原因是,您的繼承存儲庫類(如EmployeeRepository)需要提供具體的實現。抽象類用作共享實現的通用位置(並根據需要覆蓋它們)。

所以你的情況,你正在使用LINQ與你的DbContext做的基本上是正確的,但像你GETALL方法的實現應該在你的抽象類RepositoryBase通用/共享實現的一部分:

public abstract class RepositoryBase<T> where T : class 
{ 
    private YourEntities dataContext; 
    private readonly IDbSet<T> dbset; 

    protected RepositoryBase(IDatabaseFactory databaseFactory) 
    { 
     DatabaseFactory = databaseFactory; 
     dbset = DataContext.Set<T>(); 
    } 

    protected IDatabaseFactory DatabaseFactory 
    { 
     get; 
     private set; 
    } 

    protected YourEntities DataContext 
    { 
     get { return dataContext ?? (dataContext = DatabaseFactory.Get()); } 
    } 
    public virtual T GetById(long id) 
    { 
     return dbset.Find(id); 
    } 
    public virtual T GetById(string id) 
    { 
     return dbset.Find(id); 
    } 
    public virtual IEnumerable<T> GetAll() 
    { 
     return dbset.ToList(); 
    } 
} 

我建議你需要考慮是否返回像CResult這樣的錯誤結果對象,並考慮在此父子關係中是否存在CEmployee和CResult。同時考慮一下你想用你的CResult類來做什麼。在我看來,CEmployee在這種情況下處理了太多的任務。

+0

所有我的類繼承自CResult,並具有通知狀態的結果,在這種情況下,Msg_Error「Element not found」,是所有我的關卡返回一個消息,我用這個來顯示一個消息。在每個操作上。 – user1431866