簡體   English   中英

有關避免代碼復制的任何提示嗎?

[英]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方法促使我尋求幫助。

目前的想法:

  • 讓我通過Id使用Entity SQL,我可以更好地控制構建查詢字符串。
  • 廢棄實體框架和linq,因為完全抽象可能太耗費時間。

非常感謝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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM