2015-04-02 57 views
0

我想添加一個方法,它將爲我的項目中的實體創建一個IEnumerable。所有的實體都有一個下拉呈現的捕獲/編輯,所以在我看來,將它添加到我的通用存儲庫方法是有意義的。創建一個通用類中給定類型T的IEnumerable <SelectListItem>集合

我不太清楚,如果這是可行的,或如何最好地處理這一點,因爲我使用泛型類,希望下面這段代碼出售我的想法:

public interface ISpaceRepository<T> 
    where T : class 
{ 
    SpaceResult<T> GetAll(); 
    SpaceResult<T> FindBy(Expression<Func<T, bool>> predicate); 
    SpaceResult<T> Add(T entity); 
    SpaceResult<T> Delete(T entity); 
    SpaceResult<T> Edit(T entity); 
    SpaceResult<T> FindById(int id); 
    SpaceResult<T> SelectList(); 
} 

非常基本的接口定義。這得到我SpaceRespository類實現:

public class SpaceRepository<T> 
    : ISpaceRepository<T> where T : class 
{ 
    // content omitted for ease of reading 
} 

在我的倉庫,我想在這裏建立一個,將建立起來了IEnumerable收集方法,對於類型T的問題是,默認情況下,牛逼不公開任何屬性,所以我不能讓T.Name和T.Id,所以我有一個謂語玩弄於完成工作:

public SpaceResult<T> SelectList(Expression<Func<T, bool>> predicate) 
    { 
     SpaceResult<T> result = new SpaceResult<T>(); 

     try 
     { 
      result.SelectList = this.GetAll().Select(predicate); 
     } 
     catch (System.Exception ex) 
     { 
      result.IsError = true; 
      result.Message = ex.Message; 
      result.InnerException = ex.InnerException.Message; 
     } 

     return result; 
    } 

這種方法的工作原理,但我必須界定謂詞每次我構建一個選擇項目集合以綁定到Razor(MVC)中的下拉列表。

有沒有更簡單的方法?反思太昂貴。沒有特別的理由不在視圖模型層次上做這件事,我只是在學習:$時玩弄幾個想法。

更新

的想法是展現,將創建SelectListItem元素的集合T的給定的數據庫實體存儲庫模式中的一個通用的方法,而不必我和另一個開發複製的代碼數據庫中的每個表。

更新1

一個例子:

ISpaceRepository<Building> _repo = new SpaceRepository<Building>(); 


SpaceResult<Building> result = this._repo.SelectList((x => new SelectListItem { 
    x.Id, 
    x.Description })); 

更新2

大廈看起來是這樣的:

[Table("buildings")] 
public class Building 
{ 
    [Column("id")] 
    [Key] 
    public int Id {get;set;} 

    [Column("description")] 
    public string Description {get;set;} 
} 

所以在想,也許如果我添加一個自定義屬性到我在選擇列表中需要的列,我可以使用反射,但這對於我之後的解決方案而言聽起來很昂貴。

[Table("buildings")] 
public class Building 
{ 
    [Column("id")] 
    [Key] 
    [SelectListItem] 
    public int Id {get;set;} 

    [Column("description")] 
    [SelectListItem] 
    public string Description {get;set;} 
} 
+0

「這在我的SpaceRespository類中得到了繼承:」 - nitpick:由於'ISpaceRepository '是一個接口,它在* SpaceRepository類中被實現。 – 2015-04-02 11:52:52

+0

:$謝謝你,是的 – JadedEric 2015-04-02 11:53:30

+0

你能展示一個示例性謂詞函數嗎? 「T」的不同類型是否有共同的祖先,它可以提供所有可能的類型「T」共有的屬性? – 2015-04-02 11:54:28

回答

1

如何:

interface IEntity { 
    public int Id { get; } 
    public string Name { get; } 
} 

[Table("buildings")] 
public class Building : IEntity 
{ 
    [Column("id")] 
    [Key] 
    public int Id {get;set;} 

    [Column("description")] 
    public string Description {get;set;} 

    [NotMapped] 
    public string Name { get { return this.Description; } } 
} 

[Table("cars")] 
public class Car : IEntity 
{ 
    [Column("id")] 
    [Key] 
    public int Id {get;set;} 

    [Column("title")] 
    public string Title {get;set;} 

    [NotMapped] 
    public string Name { get { return this.Title; } } 
} 

,然後,而不是一個通用的方法,是寫一個關於實現這個接口足以元素的作品?

的方法:

public SpaceResult<IEntity> SelectList() 
{ 
    SpaceResult<IEntity> result = new SpaceResult<IEntity>(); 

    try 
    { 
     result.SelectList = this.GetAll().Select(x => new SelectListItem { x.Id, x.Name }); 
    } 
    catch (System.Exception ex) 
    { 
     result.IsError = true; 
     result.Message = ex.Message; 
     result.InnerException = ex.InnerException.Message; 
    } 

    return result; 
} 

用法:

ISpaceRepository<Building> _repo = new SpaceRepository<Building>(); 
SpaceResult<IEntity> result = this._repo.SelectList(); 

ISpaceRepository<Car> _repo = new SpaceRepository<Car>(); 
SpaceResult<IEntity> result = this._repo.SelectList(); 

只要你的所有實體類實現公共接口,可以應用同樣的方法。

+0

可以正常工作,但我想在我的資源庫模式中創建一個通用方法,以滿足數據庫中的所有表,允許它們公開IEnumerable 而無需爲每個表中的每個表創建此方法視圖模型。如果這有道理? – JadedEric 2015-04-02 12:12:41

+0

它確實有道理。但是我的建議並沒有太大的不同。我會盡快闡述我的答案。 – tafa 2015-04-02 12:28:41

+0

我正在玩你指出的想法。基本上,T實現了IEntity,它只有兩個屬性,所以這些屬性將被用於構建項目... – JadedEric 2015-04-02 12:53:33

相關問題