0

我想知道是否可以使用C#/ ASP.NET將模型類型映射到存儲庫類型。正如你所看到的,我試圖實現工作模式庫/工作單元。實現示例如下:ASP.NET地圖模型類型爲存儲庫類型?

public class UnitOfWork : IDisposable 
{ 
    private SchoolContext context = new SchoolContext(); 
    private DepartmentRepository departmentRepository; 
    private CourseRepository courseRepository; 

    public DepartmentRepository DepartmentRepository 
    { 
     get 
     { 

      if (this.departmentRepository == null) 
      { 
       this.departmentRepository = new DepartmentRepository(context); 
      } 
      return departmentRepository; 
     } 
    } 

    public CourseRepository CourseRepository 
    { 
     get 
     { 

      if (this.courseRepository == null) 
      { 
       this.courseRepository = new CourseRepository(context); 
      } 
      return courseRepository; 
     } 
    } 

但是,由於它有一個問題,那的UnitOfWork需要保持性能一長串每個倉庫類型。在這個例子中,它不是很糟糕,因爲只有兩個實體類型(部門,課程)和兩個相應的存儲庫(部署庫和課程存儲庫)。但隨着應用程序規模的增長,UnitOfWork類很快變得龐大而混亂,數十甚至數百個屬性,它將成爲上帝之類的東西。

我想要的是更通用的東西,比如將模型類型映射到存儲庫對象的通用方法GetRepository()。下面的僞代碼演示了我想要的:

// definition 
public TRepository GetRepository<TModel>(){ // pending implementation } 

// use-case 
var departmentRepository = UnitOfWork.GetRepository<TModel>(); 

那麼我該如何編寫這樣的代碼,將模型類型映射到存儲庫對象?恐怕AutoMapper不能工作,因爲它只映射具體實現,而不是泛型類型。你怎麼看?當條件不是將每個存儲庫實現硬編碼爲工作單元中的屬性時,如何處理此問題?

+1

從UnitOfWork中刪除存儲庫。將UoW注入存儲庫並從Context獲取實體集。 – Jasen

+1

看起來有點像依賴注入和控制反轉的工作。您可以在您的IOC引導程序中註冊所有模型和相應的存儲庫關聯... – Theo

+0

您可以編寫自己的映射器來解決此問題 –

回答

0

你可以這樣定義一個擴展方法:

public static class Mapper 
{ 
    public static T Map<T>(Object source) where T : class 
    { 
     var instance = Activator.CreateInstance<T>(); 

     foreach (var property in typeof(T).GetProperties()) 
     { 
      if (property.CanRead) 
      { 
       var sourceProperty = source.GetType().GetProperty(property.Name); 

       if (sourceProperty == null) 
       { 
        continue; 
       } 

       var value = sourceProperty.GetValue(source); 

       property.SetValue(instance, value); 
      } 
     } 

     return instance; 
    } 
} 

如果你想一個類從另一個地圖:

var foo = Mapper.Map<CustomerViewModel>(new Customer { CustomerID = "ACME", CompanyName = "Acme Corp.", ContactName = "Jhon Doe" }); 

輸出:

{CustomerViewModel} 公司名稱:「 Acme公司「 客戶ID:「ACME」

假設你有以下類:

public class Customer 
{ 
    public String CustomerID { get; set; } 

    public String CompanyName { get; set; } 

    public String ContactName { get; set; } 
} 

public class CustomerViewModel 
{ 
    public String CustomerID { get; set; } 

    public String CompanyName { get; set; } 
} 

此外,這是可以提高用於從動態對象(ExpandoObject),字典映射此擴展方法的基本思想(詞典<字符串,對象>)並創建映射表以獲得更好的集合映射(項目的大集合)的性能。

此方法也支持匿名對象。

請讓我知道這個答案是否有用,我們可以根據您的要求改進算法。

+0

那麼我知道如何將領域模型映射到視圖模型,只需使用automapper即可。我的問題是,如何映射兩個對象具有無關的屬性/組合,但具有相似的命名約定。比方說,我有一個名爲'UserModel'的域模型,其存儲庫名爲'UserRepository',我想將'UserModel'映射到'UserRepository'。我怎樣才能做到這一點? –

+0

在這種情況下,類的名稱只與屬性名稱無關;你有沒有嘗試修改這段代碼來支持lambda表達式,也許我錯過了你的問題中的某些內容,並且你想映射不同名稱的屬性 –