[英]Using two similar collection view cells and thereby avoiding code duplication
[英]Any tips on avoiding code Duplication on this abstraction?
所以我正在使用SQL Compact Edition上的Entity Framework構建一個App。 我不喜歡使用Entites作為我的業務對象的想法,所以我一直在構建一個層(我稱之為ObjectModel層,不是最好的術語)介於兩者之間,它將采用我的普通對象,使用它們填充和保存實體。 反之亦然 - 采取行動,填充POCO作為業務對象
假設我有一個名為Customer的POCO對象,
public class Customer:ICustomer
{
#region ICustomer Members
public System.Guid id {get;set;}
public string Forename {get;set;}
public string Surname { get; set; }
#endregion
}
我想用我的ObjectModel層填充它。 我目前這樣做......
OM_Customer<ICustomer,Entity.Customer> customerLayer = new OM_Agent<ICustomer,Entity.Customer>();
ICustomer businessObject = customerLayer.GetById(new Guid("4a75d5a5-6f5a-464f-b4b3-e7807806f1a9"));
OM_Customer類繼承自ObjectModelBase,它位於下面。
public abstract class ObjectModelBase<BllClass, EntityClass>
{
public DataStoreEntities1 db;
public EntityClass _dataObject;
public string setName;
#region POCO-ORM Mapping Functions
public EntityClass MapBLLToEntity(BllClass bllObject)
{
Mapper.CreateMap<BllClass, EntityClass>();
return Mapper.Map<BllClass, EntityClass>(bllObject);
}
public BllClass MapEntityToBLL(EntityClass entityObject)
{
Mapper.CreateMap<EntityClass, BllClass>();
return Mapper.Map<EntityClass, BllClass>(entityObject);
}
#endregion
public void Save(BllClass toAdd)
{
_dataObject = MapBLLToEntity(toAdd);
using (db = new DataStoreEntities1())
{
db.AddObject(setName, _dataObject);
db.SaveChanges();
}
}
public BllClass GetById(Guid id)
{
using (db = new DataStoreEntities1())
{
EntityClass result = (EntityClass)((object)(from c in db.CustomerSet where c.id == id select c).First());
return MapEntityToBLL(result);
}
}
}
這里的問題在於GetById方法。 子類可以使用Save方法,因為所有實體框架對象上下文都有AddObject()方法。
但是,我希望有一個通用的getById方法,因為我的所有實體都有一個名為id的屬性(在db中也是主鍵)。問題是這里的linq ...
ModelClass result = (ModelClass)((object)(from c in db.CustomerSet where c.id == id select c).First());
特定於db.CustomerSet 。 我希望這個抽象類為我的所有實體提供通用的CRUD / Paging /'Collection Retrieval',但是沒有重復的擊鍵,這個簡單的GetById方法促使我尋求幫助。
目前的想法:
非常感謝SO社區如何解決上述問題。
首先,我將首先質疑為什么你覺得使用EF實體,因為你的業務實體一定是壞事? 我已經完成了許多項目,但我還沒有遇到任何我無法克服的嚴重問題。
話雖如此,如果你真的覺得你有充分的理由將兩者分開,這里有一個選擇。
您可以使用委托將特定實體集對象注入查詢,將另一個委托注入密鑰的選擇器 - 它可以允許衍生工具僅指定其存儲語義。 所以你的代碼看起來像:
public abstract class ObjectModelBase<BllClass, EntityClass>
{
// ... same basic code here...
// supplied by your derivatives...
protected abstract Func<IQueryable<EntityClass>> GetEntitySet { get; };
protected abstract Func<Guid,Func<EntityClass,bool>> KeySelector { get; }
public BllClass GetById(Guid id)
{
using (db = new DataStoreEntities1())
{
EntityClass result = (EntityClass)((object)
GetEntitySet()
.Where( KeySelector( id ) )
.First();
return MapEntityToBLL(result);
}
}
}
public class OM_Customer : ObjectModelBase<ICustomer,Entity.Customer>
{
protected abstract Func<IQueryable<Entity.Customer>> GetEntitySet
{
get { return db.CustomerSet; }
}
protected abstract Func<Guid,Func<Entity.Customer,bool>> KeySelector
{
get { return (g => (e => e.Id == g)); }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.