继承和泛型类

时间:2017-02-13 14:51:25

标签: c# oop generics

我最近做了一些关于根据我的需要调整Dapper的工作,它工作得很好,但我注意到我有一些重复的代码,我想尽可能地缩小它。目前的工作方式是:

我有一个基本的DAL类,可以执行一些基本操作,例如Save,Delete,Get等。除此之外,它还有一个名为IsNew的属性......好吧...你猜对了它是否是新的或者现有实体。

public class DalBase
{
   public bool IsNew
   {
      get;
      private set;
   }

   public static T New<T>()
   {
      // removed for clarity
   }

   public void Get<T>(params object[] parameters)
   {
      // removed for clarity
   }    

   public void Save()
   {
      // removed for clarity
   }

   public void Delete()
   {
      // removed for clarity
   }
}

如果我想定义我的实体,让我们说,我会这样做:

public partial class Person
{
    private PersonDal m_dal;

    public bool IsNew
    {
        get
        {
            return m_dal.IsNew;
        }
    }

    public int? PersonID
    {
        get
        {
            return m_dal.PersonID;
        }
    }

    public string PersonName
    {
        get
        {
            return m_dal.PersonName;
        }
        set
        {
            m_dal.PersonName = value;
        }
    }

    public string PersonSurname
    {
        get
        {
            return m_dal.PersonSurname;
        }
        set
        {
            m_dal.PersonSurname = value;
        }
    }

    public DateTime? PersonDateOfBirth
    {
        get
        {
            return m_dal.PersonDateOfBirth;
        }
        set
        {
            m_dal.PersonDateOfBirth = value;
        }
    }

    private Person()
    {
        m_dal = DalBase.New<PersonDal>();
    }

    public static Person New()
    {
        return new Person();
    }

    public static Person Get(int PersonID)
    {
        var personDal = DalBase.Get<PersonDal>(PersonID);

        if (personDal == null)
            return null;

        var person = new Person();
        person.m_dal = personDal;
        return person;
    }

    private class PersonDal : DalBase
    {
        public int? PersonID
        {
            get;
            set;
        }

        public string PersonName
        {
            get;
            set;
        }

        public string PersonSurname
        {
            get;
            set;
        }

        public DateTime? PersonDateOfBirth
        {
            get;
            set;
        }

        private PersonDal()
        {
            IsNew = true;
        }
    }
}

正如您所看到的,我的DAL包含在Entity类中。这样我可以做各种各样的事情,比如映射,更新或插入前的初步检查等等。但是,这不是我在这里复制粘贴此代码的原因:))

我想要做的是以某种方式从实体中消除IsNew,因为它将在每个实体定义上重复并且它看起来有点多余而且更多因为我可能会考虑添加一些常用于所有表的列,例如DateOfEdit, UserEdit等...正如您所看到的那样,将它添加到一个地方并且继承它并在每个实体定义中保留特定列将非常方便。

我现在尝试做的是使用这样的泛型:

public class EntityBase<T> where T : DalBase
{
    protected T m_dal;

    public bool IsNew
    {
        get
        {
            return m_dal.IsNew;
        }
    }
}

这将允许我继承具有特定Dal类的基本实体,因此我可以将我的person实体定义为:

public partial class Person : EntityBase<PersonDal>

这种方法的问题在于PersonDal是Person实体的私有类,因此具有比实体本身更少的可访问性,并且如果我只是将其定义为public - 那么它胜过整个目的,因为DAL仅被使用与之相关的实体!

还有其他方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

DAL与实体无关。你在这里混合概念。使用DAL作为单个类,而不是实体类的成员字段/变量,并将实体类型传递给DAL。 如果必须在实体中使用DAL,请使用DI并在构造函数中传递DAL实例。

或者,如果您想使用原始方法,请创建一个包含两种实体类型的简单EF项目,并检查其工作原理。