我的存儲庫處理併爲豐富的域模型提供持久性。我不想將貧血的Entity Framework數據實體暴露給我的業務層,所以我需要在它們之間進行映射。存儲庫模式和域模型與實體框架之間的映射
在大多數情況下,從數據實體構造域模型實例需要使用參數化的構造函數和方法(因爲它很豐富)。這不像一個屬性/場匹配那麼簡單。 AutoMapper可以用於相反的情況(映射到數據實體),但不能在創建域模型時使用。
以下是我的存儲庫模式的核心。
的EntityFrameworkRepository
類的工作有兩個泛型類型:
TDomainModel
:豐富的域模型TEntityModel
:定義
兩個抽象方法的實體框架數據實體:
ToDataEntity(TDomainModel)
:轉換爲數據實體(對於Add()
和Update()
方法)ToDomainModel(TEntityModel)
:構建域模型(對於Find()
方法)。
這些方法的具體實現將定義所涉及的存儲庫所需的映射。
public interface IRepository<T> where T : DomainModel
{
T Find(int id);
void Add(T item);
void Update(T item);
}
public abstract class EntityFrameworkRepository<TDomainModel, TEntityModel> : IRepository<TDomainModel>
where TDomainModel : DomainModel
where TEntityModel : EntityModel
{
public EntityFrameworkRepository(IUnitOfWork unitOfWork)
{
// ...
}
public virtual TDomainModel Find(int id)
{
var entity = context.Set<TEntityModel>().Find(id);
return ToDomainModel(entity);
}
public virtual void Add(TDomainModel item)
{
context.Set<TEntityModel>().Add(ToDataEntity(item));
}
public virtual void Update(TDomainModel item)
{
var entity = ToDataEntity(item);
DbEntityEntry dbEntityEntry = context.Entry<TEntityModel>(entity);
if (dbEntityEntry.State == EntityState.Detached)
{
context.Set<TEntityModel>().Attach(entity);
dbEntityEntry.State = EntityState.Modified;
}
}
protected abstract TEntityModel ToDataEntity(TDomainModel domainModel);
protected abstract TDomainModel ToDomainModel(TEntityModel dataEntity);
}
這裏是一個倉庫實現的一個基本的例子:
public interface ICompanyRepository : IRepository<Company>
{
// Any specific methods could be included here
}
public class CompanyRepository : EntityFrameworkRepository<Company, CompanyTableEntity>, ICompanyRepository
{
protected CompanyTableEntity ToDataEntity(Company domainModel)
{
return new CompanyTable()
{
Name = domainModel.Name,
City = domainModel.City
IsActive = domainModel.IsActive
};
}
protected Company ToDomainModel(CompanyTableEntity dataEntity)
{
return new Company(dataEntity.Name, dataEntity.IsActive)
{
City = dataEntity.City
}
}
}
問題:
一個Company
可能是由許多Departments
。如果我想在獲取Company
時從CompanyRepository
急切加載這些文件,那麼我將在哪裏定義Department
和DepartmentDataEntity
之間的映射?
我可以在CompanyRepository
中提供更多的映射方法,但這很快就會變得混亂。系統中很快會出現重複的映射方法。
什麼是更好的方法來解決上述問題?
1.根據企業經營理念stricly定義的公司。 2.對實體用例進行建模3.請注意,如果執行得當,您將不會遇到現在存在的問題。並忽略任何與持久性相關的東西 – MikeSW
_AutoMapper可用於相反的情況[...],但不能在創建域模型時使用._爲什麼不可能_both_方式? –
@ThomasWeller,存在通過AutoMapper,Jimmmy博加德的創造者的答案 - [用於AutoMapper雙向映射的情況下(http://lostechies.com/jimmybogard/2009/09/18/the-case-for-雙向映射功能於automapper /)。 –