2017-03-15 52 views
2

前幾天我決定使用工作單元&通用存儲庫在我的項目中。經過一番搜索I found this solution來做到這一點。ASP MVC將ApplicationUser添加到通用存儲庫

在這個模式中,我們有4層:

1. UI 
2. Model 
3. Repository 
4. Service 

點是在模型層Entity類的所有域模型的繼承。例如:

public class Project : Entity<int> { 
... 
} 

這是我Entity類:

public abstract class BaseEntity { } 
public abstract class Entity<T> : BaseEntity, IEntity<T> 
{ 
    public virtual T Id { get; set; } 
} 

現在,當我要加入ApplicationUser類UOF模式我得到一個錯誤,這個概念是ApplicationUser不是來自BaseEntity繼承。

提示:ApplicationUserIdentityUser

繼承最新最好的做法ApplicationUser添加到我的設計模式?

UPDATE

IApplicationUserService接口得到錯誤信息

public interface IApplicationUserService : IEntityService<ApplicationUser> 
{ 
    Task<Part> GetById(int? id); 
} 

IEntityService

public interface IEntityService<T> : IService 
where T : BaseEntity 
{ 
    void Create(T entity); 
    void Delete(T entity); 
    Task<List<T>> GetAllAsync(); 
    IEnumerable<T> GetAll(); 
    Task Update(T entity); 
} 
+0

請自行顯示錯誤。尚不清楚它來自哪裏。 –

+0

請再看一遍。 – user3748973

回答

2

IEntityService<T>接口有一個約束條件,因此需要從BaseEntity派生出作爲T提供的每種類型。由於ApplicationUser類是從IdentityUser派生的,因此無法實現約束。

您可以通過兩種方式解決這個問題:

  1. 爲用戶創建一個類,它是一個真正的實體,因此從BaseEntityEntity<T>的。這樣,這種限制就不會受到侵犯。這個班可以命名爲ApplicationUserEntity或類似的東西。如果您需要存儲應用程序用戶,則需要將ApplicationUser的屬性映射到ApplicationUserEntity。您可能還會考慮是否真的需要ApplicationUser類從IdentityUser派生,並從BaseEntity派生而不是創建一個新類。
  2. 作爲替代方案,您可以創建一個每個實體都需要實現的接口。如果您的示例沒有顯示完整的BaseEntity類,則它沒有任何成員。所以你可以很容易地通過界面替代BaseEntity,例如IEntity。您在目前使用BaseEntity的地方使用此接口,特別是在約束中。由於類只能從一個基類派生,但可以實現多個接口,所以可以在ApplicationUser中實現IEntity,以便您可以將它用作IEntityService<T>的類型參數。

我喜歡第一種方法,因爲它避免了認證環境與持久性的混合。但是,如果要實施第二種方法,則首先將BaseEntity重新命名爲IEntity,例如,將BaseEntity重命名爲IEntity。通過訪問上下文菜單。這確保在以前使用BaseEntity的地方使用新名稱。然後換

public abstract class IEntity { } 

public interface IEntity { } 
+0

我更喜歡第二種方式。你能用代碼解釋嗎? – user3748973

+0

@ user3748973我已經用示例擴展了答案。希望能幫助到你。 – Markus

0

解決你的問題是不是要努力推動方釘成的圓孔。自己回答這個問題:當應用於項目的Identity部分時,通用知識庫會給你什麼好處?

我懷疑會有很多痛苦和咒罵以及大量的自定義代碼,因爲ApplicationUserManager可能不適用於您的解決方案,您必須編寫自定義存儲或至少部分實現某些邏輯。

只是因爲有一個模式,並不意味着你必須在任何地方應用它。特別是那些圖案不適合的地方。

相關問題